{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Naive Bayes Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T07:58:32.360567Z",
     "start_time": "2020-12-23T07:57:52.955254Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Now we are compute the vocabulary...\n",
      "Now we are compute the prior and conditional probabilities...\n",
      "Aha! We finish the training process.\n",
      "The accuracy of our model is: 0.6713235294117647\n"
     ]
    }
   ],
   "source": [
    "# %load train_nb.py\n",
    "\"\"\"\n",
    "Train our Naive Bayes algorithm and get the validation.\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "import numpy as np\n",
    "from model import NaiveBayes\n",
    "\n",
    "# Get training data and validation data.\n",
    "train_data = np.load('Dataset/data/train.npy')\n",
    "val_data = np.load('Dataset/data/val.npy')\n",
    "\n",
    "# train our naive bayes model\n",
    "model = NaiveBayes.NB(labels=[0,1,2,3]) # [0, 1, 2, 3] < -- > ['gufeng', 'liuxing', 'minyao', 'shuochang']\n",
    "model.train(train_data)\n",
    "\n",
    "# validation and compute the accuracy\n",
    "pred_y, true_y = model.test(val_data)\n",
    "print('The accuracy of our model is:', (pred_y == true_y).sum() / len(pred_y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T07:58:41.342081Z",
     "start_time": "2020-12-23T07:58:40.105123Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The accuracy of our model is: 0.6713235294117647\n",
      "total_accuracy:  0.6713235294117647\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.846154  0.876106  0.860870\n",
      "1   0.510588  0.628986  0.563636\n",
      "2   0.688889  0.539130  0.604878\n",
      "3   0.485981  0.504854  0.495238\n"
     ]
    }
   ],
   "source": [
    "from utils.error_analysis import *\n",
    "# from utils import *\n",
    "\n",
    "# validation and compute the accuracy\n",
    "pred_y, true_y = model.test(val_data)\n",
    "print('The accuracy of our model is:', (pred_y == true_y).sum() / len(pred_y))\n",
    "\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T07:58:48.518723Z",
     "start_time": "2020-12-23T07:58:47.360636Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The accuracy of our model is: 0.6752655538694993\n",
      "total_accuracy:  0.6752655538694993\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.861048  0.863014  0.862030\n",
      "1   0.546948  0.626344  0.583960\n",
      "2   0.658960  0.526559  0.585366\n",
      "3   0.476636  0.680000  0.560440\n"
     ]
    }
   ],
   "source": [
    "test_data = np.load('Dataset/data/test.npy')\n",
    "\n",
    "# validation and compute the accuracy\n",
    "pred_y, true_y = model.test(test_data)\n",
    "print('The accuracy of our model is:', (pred_y == true_y).sum() / len(pred_y))\n",
    "\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## average svm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T08:00:41.730747Z",
     "start_time": "2020-12-23T07:59:02.088212Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load data...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\jieba.cache\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "processing...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading model cost 0.670 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "averaging...\n"
     ]
    }
   ],
   "source": [
    "# %load train_avsvm.py\n",
    "\"\"\"\n",
    "Train our average svm model.\n",
    "\"\"\"\n",
    "\n",
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "from utils.doc_tool import *\n",
    "from utils.error_analysis import *\n",
    "\n",
    "# load in our data\n",
    "print('load data...')\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)\n",
    "\n",
    "# load in our training data and val data\n",
    "print('processing...')\n",
    "train_data = dataset2mat(np.load('Dataset/data/train.npy'), w2v)\n",
    "val_data = dataset2mat(np.load('Dataset/data/val.npy'), w2v)\n",
    "\n",
    "# compute the average and trainsform it into numpy\n",
    "print('averaging...')\n",
    "avg_train = []\n",
    "train_label = []\n",
    "avg_val = []\n",
    "val_label = []\n",
    "\n",
    "for i in range(len(train_data)):\n",
    "    avg_train.append(train_data[i][0].mean(axis=0)) \n",
    "    train_label.append(int(train_data[i][1]))\n",
    "for i in range(len(val_data)):\n",
    "    avg_val.append(val_data[i][0].mean(axis=0))\n",
    "    val_label.append(int(val_data[i][1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T08:01:09.144305Z",
     "start_time": "2020-12-23T08:00:45.574660Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape='ovr', degree=3, gamma=5.0, kernel='rbf',\n",
       "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
       "  tol=0.001, verbose=False)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "model = SVC(kernel='rbf',decision_function_shape ='ovr',gamma=5.,C=1.0,coef0=0.0, degree=3)\n",
    "model.fit(avg_train, train_label)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T08:01:30.464268Z",
     "start_time": "2020-12-23T08:01:27.819088Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7286764705882353\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEXCAYAAABf36TeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XlYVGX7wPHvwADigojNgILiXuYSipWWSWYCKiSQlprgkmklWFaaImqumVGkkdmmueUrZoiZYqalr7klP3NLzVQ0FVlUQFSWYc7vD99GCJNBHQ4z3Z+uc13OM2fOuWe0e565z3OeR6MoioIQQgirZqd2AEIIIe6cJHMhhLABksyFEMIGSDIXQggbIMlcCCFsgCRzIYSwAZLMhUlxcTELFy4kLCyM3r1707NnT959910KCwvv6JgvvfQSAQEBLF26tMKvP3DgAKNGjbrt899tly9fJiIi4h+f7927N7m5uZUYkRDXaWScufjLxIkTycnJYcaMGdSqVYurV6/yxhtvUKNGDd59993bOua5c+cICAjg119/xd7e/i5HXPnOnDlDcHAwe/fuVTsUIUqRnrkAriepb7/9lpkzZ1KrVi0AqlevzpQpU3jyySeB673SN954g6CgIIKDg5k9ezYGgwGANm3a8OGHH9KvXz+eeOIJvvrqK/Ly8hg2bBgGg4GwsDBOnz7Nvffey8WLF03n/evxlStXGDVqFL179yY0NJSYmBiMRiO7du0iKCjots5/M23atOH999+nT58+9OzZk3Xr1jFq1CgCAwOJiIjg6tWrAHz99df07duXkJAQunbtajre+PHjyc/Pp3fv3hQXF9O6dWteeeUVAgICOHDggOn9xMfH069fP4qLi8nMzKRz587s3LnTAn9zQvyPIoSiKMnJycrTTz99y33Gjh2rTJs2TTEajUpBQYEydOhQ5ZNPPlEURVFatGihLFmyRFEURTlw4IDSunVrJT8/X/nzzz8VHx8f0zFatGihXLhwoczjxMREZejQoYqiKIrBYFAmTJigpKamKjt37lR69ep12+f/uxYtWiiLFi1SFEVRPvnkE6Vdu3bK+fPnleLiYiU0NFRZs2aNkpeXpzzzzDPKxYsXFUVRlL1795rew83eT2JiYpn3YzAYlOeee0755JNPlMGDBysff/xxuX8HQtwJ6ZkL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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.844581  0.913717  0.877790\n",
      "1   0.573003  0.602899  0.587571\n",
      "2   0.725000  0.693478  0.708889\n",
      "3   0.750000  0.495146  0.596491\n"
     ]
    }
   ],
   "source": [
    "pred_y = model.predict(avg_val)\n",
    "pred_y = np.array(pred_y)\n",
    "true_y = np.array(val_label)\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T08:02:24.424163Z",
     "start_time": "2020-12-23T08:02:06.025107Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7230652503793626\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.889640  0.901826  0.895692\n",
      "1   0.586294  0.620968  0.603133\n",
      "2   0.680288  0.653580  0.666667\n",
      "3   0.687500  0.586667  0.633094\n"
     ]
    }
   ],
   "source": [
    "test_data = dataset2mat(np.load('Dataset/data/test.npy'), w2v)\n",
    "\n",
    "avg_test = []\n",
    "test_label = []\n",
    "\n",
    "for i in range(len(test_data)):\n",
    "    avg_test.append(test_data[i][0].mean(axis=0))\n",
    "    test_label.append(int(test_data[i][1]))\n",
    "    \n",
    "pred_y = model.predict(avg_test)\n",
    "pred_y = np.array(pred_y)\n",
    "true_y = np.array(test_label)\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TextCNN (static)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:17:54.956069Z",
     "start_time": "2020-12-21T08:17:30.766714Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "import utils\n",
    "# from model.TextCNN import *\n",
    "\n",
    "# loading our w2v\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:19:53.098074Z",
     "start_time": "2020-12-21T08:18:08.922746Z"
    }
   },
   "outputs": [],
   "source": [
    "from Dataset.Dataset import *\n",
    "from utils.doc_tool import *\n",
    "row_train = np.load('Dataset/data/train.npy')\n",
    "row_val = np.load('Dataset/data/val.npy')\n",
    "row_test = np.load('Dataset/data/test.npy')\n",
    "train_data = TextDataset(dataset2mat(row_train, w2v))\n",
    "val_data = TextDataset(dataset2mat(row_val, w2v))\n",
    "test_data = TextDataset(dataset2mat(row_test, w2v))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:19:53.111988Z",
     "start_time": "2020-12-21T08:19:53.102058Z"
    }
   },
   "outputs": [],
   "source": [
    "class TextCNN(nn.Module):\n",
    "    def __init__(self, embed_dim=200, windows=[3,4,5], kernel_num=100, fc=[256,256,100], dropout=0.5, class_num=4):\n",
    "        super().__init__()\n",
    "        self.class_num = class_num\n",
    "        self.windows = windows\n",
    "        self.device = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')\n",
    "        \n",
    "        self.conv = nn.ModuleList()\n",
    "        for i,h in enumerate(windows):\n",
    "            self.conv.append(nn.Conv2d(1, kernel_num, kernel_size=(h, embed_dim)))\n",
    "        \n",
    "        li = [len(windows) * kernel_num] + fc + [class_num]\n",
    "        self.fc = []\n",
    "        for i, j in zip(li, li[1:]):\n",
    "            self.fc.extend([\n",
    "                nn.Linear(i,j),\n",
    "                nn.ReLU(),\n",
    "            ])\n",
    "        self.fc.pop() # 最后一层不需要 relu\n",
    "        self.fc = nn.Sequential(*self.fc)\n",
    "        self.dropout = nn.Dropout(dropout)\n",
    "        \n",
    "    @staticmethod\n",
    "    def conv_and_pool(x, conv):\n",
    "        x = conv(x)\n",
    "        x = F.relu(x.squeeze(3))\n",
    "        x = F.max_pool1d(x, x.size(2)).squeeze(2)\n",
    "        return x\n",
    "    \n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        Compute the forward pass of TextCNN.\n",
    "        \n",
    "        Args:\n",
    "        - x: (batch, len, w2v_dim) torch.\n",
    "        \n",
    "        Returns:\n",
    "        - logit: (batch, 4) the corresponding logits.\n",
    "        \"\"\"\n",
    "        x = x.unsqueeze(1)\n",
    "        x = torch.cat([self.conv_and_pool(x, conv) for conv in self.conv], dim=1)\n",
    "        x = self.dropout(x)\n",
    "        x = self.fc(x)\n",
    "        logit = F.log_softmax(x, dim=1)\n",
    "        return logit\n",
    "    \n",
    "    def loss(self, y, labels):\n",
    "        \"\"\"\n",
    "        Compute the loss.\n",
    "        \n",
    "        Args:\n",
    "        - y: :torch.tensor: (batch,) the prediction.\n",
    "        - labels: :torch.LongTensor: (batch,) the true labels.\n",
    "        \n",
    "        Returns:\n",
    "        - loss: :torch.tensor: the corresponding tensor.\n",
    "        \"\"\"          \n",
    "        loss = F.nll_loss(y, labels)\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:19:53.207016Z",
     "start_time": "2020-12-21T08:19:53.114686Z"
    }
   },
   "outputs": [],
   "source": [
    "def validation(model, val_iter, val_losses):\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        ls = []\n",
    "        for data, label in val_iter:\n",
    "            data = data.to(device)\n",
    "            label = label.long().to(device)\n",
    "            logit = model(data)\n",
    "            ls.append(F.nll_loss(logit, label).item())\n",
    "        mean_loss = np.array(ls).mean()\n",
    "        val_losses.append(mean_loss)\n",
    "    model.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:19:53.307465Z",
     "start_time": "2020-12-21T08:19:53.209527Z"
    }
   },
   "outputs": [],
   "source": [
    "def init_network(model, method='kaiming'):\n",
    "    \"\"\"\n",
    "    Initialize our pytorch model.\n",
    "    \n",
    "    Args:\n",
    "    - model: our pytorch model.\n",
    "    - method: weight initialize method.\n",
    "    \"\"\"\n",
    "    assert method in ['kaiming', 'xavier'], 'Your initialization should be xavier or kaiming'\n",
    "    for name, w in model.named_parameters():\n",
    "        if 'weight' in name:\n",
    "            if method == 'kaiming':\n",
    "                nn.init.kaiming_normal_(w)\n",
    "            elif method == 'xavier':\n",
    "                nn.init.xavier_normal_(w)\n",
    "            else:\n",
    "                nn.init.normal_(w)\n",
    "        elif 'bias' in name:\n",
    "            nn.init.constant_(w, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:25:14.696831Z",
     "start_time": "2020-12-21T08:20:29.522876Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TextCNN(\n",
      "  (conv): ModuleList(\n",
      "    (0): Conv2d(1, 256, kernel_size=(2, 200), stride=(1, 1))\n",
      "    (1): Conv2d(1, 256, kernel_size=(3, 200), stride=(1, 1))\n",
      "    (2): Conv2d(1, 256, kernel_size=(4, 200), stride=(1, 1))\n",
      "  )\n",
      "  (fc): Sequential(\n",
      "    (0): Linear(in_features=768, out_features=4, bias=True)\n",
      "  )\n",
      "  (dropout): Dropout(p=0.5, inplace=False)\n",
      ")\n",
      "epoch: 0\t\t test loss: 0.7831880396062677\n",
      "epoch: 1\t\t test loss: 0.749539391560988\n",
      "epoch: 2\t\t test loss: 0.7215772542086515\n",
      "epoch: 3\t\t test loss: 0.7141581340269609\n",
      "epoch: 4\t\t test loss: 0.7064166990193453\n",
      "epoch: 5\t\t test loss: 0.691926511851224\n",
      "epoch: 6\t\t test loss: 0.6963444731452249\n",
      "epoch: 7\t\t test loss: 0.6877916672013022\n",
      "epoch: 8\t\t test loss: 0.704801006750627\n",
      "epoch: 9\t\t test loss: 0.6883583773266185\n",
      "epoch: 10\t\t test loss: 0.694412805817344\n",
      "epoch: 11\t\t test loss: 0.6830693320794539\n",
      "epoch: 12\t\t test loss: 0.6895036968317899\n",
      "epoch: 13\t\t test loss: 0.6840714162046259\n",
      "epoch: 14\t\t test loss: 0.6824948245828802\n",
      "epoch: 15\t\t test loss: 0.6857016357508573\n",
      "epoch: 16\t\t test loss: 0.6860610300844366\n",
      "epoch: 17\t\t test loss: 0.6798458803783763\n",
      "epoch: 18\t\t test loss: 0.6865546378222379\n",
      "epoch: 19\t\t test loss: 0.6841161847114563\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.array_tool import *\n",
    "from utils.vis_tool import *\n",
    "import torch\n",
    "device = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')\n",
    "windows = [2, 3, 4]\n",
    "kernel_num = 256\n",
    "fc = []\n",
    "\n",
    "model = TextCNN(windows=windows, kernel_num=kernel_num, fc=fc).to(device)\n",
    "init_network(model, method='kaiming')\n",
    "print(model)\n",
    "\n",
    "# training\n",
    "lr = 1e-3\n",
    "epochs = 20\n",
    "batch_size = 128\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "\n",
    "train_iter = Data.DataLoader(train_data, batch_size=batch_size, shuffle=True,collate_fn=PadCollate(dim=0))\n",
    "val_iter = Data.DataLoader(val_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=lr)\n",
    "scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.85) # adjust learning rate\n",
    "# scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[7,14], gamma=0.1)\n",
    "# optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)\n",
    "\n",
    "# train 前先 eval 一下\n",
    "validation(model, val_iter, val_losses)\n",
    "\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "    # train each epoch\n",
    "    scheduler.step() # 学习率衰减\n",
    "    for data, label in train_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.to(device)\n",
    "        logit = model(data)\n",
    "        loss = F.nll_loss(logit,label)\n",
    "        train_losses.append(loss.item())\n",
    "        \n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "    # val each epoch\n",
    "    validation(model, val_iter, val_losses)\n",
    "    print('epoch: %s\\t\\t test loss: %s' % (epoch, val_losses[-1]))\n",
    "    \n",
    "# visualization\n",
    "vis_loss(train_losses, val_losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:25:23.210609Z",
     "start_time": "2020-12-21T08:25:21.682533Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7227941176470588\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.868365  0.904867  0.886241\n",
      "1   0.561644  0.594203  0.577465\n",
      "2   0.705240  0.702174  0.703704\n",
      "3   0.696970  0.446602  0.544379\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in val_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:25:43.946944Z",
     "start_time": "2020-12-21T08:25:42.570001Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7382397572078907\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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GhrKypUr2bVrFydOnODAgQMVx32njadOnaJHjx765dZ69+7d6dGjxz8et3jxYtavX09CQgKBgYFs375dv23Tpk0GXLZ6nJ0d6ePWDQBFUVj89kae7NedgoJCZkxbxZz5L1O3bh11g6whbTq24GTcGdKuXAXgh12HKSwoIier5J6D76J+pGFjex5266JmmFVWWKTg3sOZ/733NI90cGTrD/GM9XmAomKFQbO+xidsD8kZN5n8bNc7nqdhfRssNBqulirRXLl6g6YN7bicdoPvjibp20OHd2P/L4kUFJnHM44yMrL5bM12poeaZqmttMo8aCs7O5tLly6VW7Kzs8udNyIigtmzZ6PT6QC4ceOG/vuUfX19WbZsGcXFxRw7doyWLVvSvHlztFotvr6+REdHVxj3Hcsse/furcy/gd6BAwfYtm0bWq2WESNGMGrUKKytrRkwYACKYhqfFN+4kces0I+5cuUqKz96g9kzP2XYc+60a+fC7yfi1Q6vRjzQrQ1+ozx4L3QNFhoNfbwfo569HZZWJeW2PZu/Z9SUoSpHWT32/nKZvb9c5tkn72fNZDcyruVhX9eaxx8q+czISmtBenZJkt46+ymstRY0a2xHr446XvBsT9yZNFbu+P225y4q/ut33tbakkVjHqNpIzteXFzxaMtURGz+mn79HsXFxUntUKqsMrNZwsPDWb58ebn24OBgxo8fX6Zt3rx5ZdbT09Pp2bMnc+bMwc7OjrFjx7Jlyxbs7OxwdHTU76fT6UhOTq447jttdHZ2rvAEt6Moir4k06pVK1atWsWLL75Io0aNKlWqUUtSYjoh45bQ+v5mfPLZNLIyczgSd5rz8VdYH76HrKwccnJuMm7su6xY9Yba4RrNzRu5PNitDU/69AQg6+o1tn6ym3r2diScvkRRUREPdG+jcpRV01JXj/sc6hB3uuQD3S8OxDP3BVc0GpgdHseBYyVfXG5no8XGquSNbMB/9gElZZYfT6aw9WACUFJmAbC3syL7RgEATRraciWj5J1M08Z2fDzhCc4mZvPcgm/JKyiqses0tt27/0foDNMflUPlyidBQUH670Yuzd7evsJjmzdvzooVK/TrI0aMIDIyEi8vr3L7GpI3jVKw8/LyYsSIERw7dgyAdu3asXTpUl5//fVyNfTaJiszh1FB8+n/lCuL3v03depY49SkEfsOLCVi21wits3l3+MH0921vVkncoDMtGzmjV/Jzesldd7Iz76m51Pd0Wg0/PHrWTq6tjOJF+c7cXSow9J/96JhPWugZMbJ6UvZ7Dx0gRFPtcPK0gKNBuaPepjJz9y5nFRUrPDt0USG9St5gevQvAFtnRsQezKVBnWt+Ty0L3t+vsRrKw+ZVSLPysrhwoUkund/QO1QqoVlJRZ7e3tcXFzKLYYk81OnTrFnzx79uqIoaLVanJycSEv7a7ZYSkqKvjRzJwY/z7wygoODcXV1pW7duvo2V1dXvvzyS1avXm2MLqtNxKZvuJKUzjf7fuGbfb/o2z9aMxUHh3oqRlbzmrbQ4ft8P94c8x7FxQrtu7TWz1q5cjGN+5o0UjnCqvv5dEl5ZGNoPwqLiknJvMkr7x0kNSuX6cO6smOuB5YWGk5eyGT+xl/LHDvl48PlzjcrPI4FLz3C7vleKIrCG6tiyblZwL99H6RZYzs8XJ3xcP3rHe+It78jMyff2JdpVBcuJOHo2BArK6OkkxpXUw/aUhSF+fPn07NnT+zs7Ni8eTP+/v507dqV+Ph4zp8/j4uLC1FRUQQEBFR4Po1iAkXs3KJYtUOoFY5dTVc7hFpj2BvyTVe3nAnvrHYItYqFpmOVjl941PDPCqd1da/0+fv168fatWtxcXFhw4YNbNiwgcLCQjw8PJg0aRIAhw4d0k9NdHNzY/r06RW+C5ZkbkIkmf9FkvlfJJmXVdVkvuiY4cl8SpfKJ3NjMY/3RUIIUU2sTHTqvyRzIYQoxVS/nEKSuRBClGKWz2YRQoh7jak+gUqSuRBClCIjcyGEMANW5vjlFEIIca+RkbkQQpgBSeZCCGEGJJkLIYQZsJR55kIIYfpM9AZQSeZCCFGa1kSzuSRzIYQoRcosQghhBuQDUCGEMAOSzIUQwgxIMhdCCDMgt/MLIYQZMNHJLCYbtxBCGIWFxvClsnJycvDx8eHSpUsAxMTE4Ovri4eHB0uWLNHvd/LkSQICAvD09GTGjBkUFhZWHHflwxFCCPNlqTF8qYyjR48ybNgwEhISAMjNzSU0NJSVK1eya9cuTpw4wYEDBwCYPHkyM2fOZM+ePSiKQkRERIXnl2QuhBClWGgUg5fKiIiIYPbs2eh0OgCOHTtGy5Ytad68OVqtFl9fX6Kjo7l8+TK5ubl069YNgMGDBxMdHV3h+U2iZl7HspHaIdQK3RvXUTuEWuPPtbZqh1BrXCu4oHYItYq9VccqHV+Z8kl2djbZ2dnlY7C3x97evkzbvHnzyqynpKTg6OioX9fpdCQnJ5drd3R0JDk5ucJYTCKZCyFETdFWIpmHh4ezfPnycu3BwcGMHz/+jscqSvmRvUaj+cf2ikgyF0KIUgzIm3pBQUH4+/uXa//7qPx2nJycSEtL06+npKSg0+nKtaempupLM3ciyVwIIUqpzOeatyunGKpr167Ex8dz/vx5XFxciIqKIiAgAGdnZ2xsbIiLi8PV1ZXIyEj69OlT4fkkmQshRCmVGZlXhY2NDQsXLmT8+PHk5eXh5uaGl5cXAIsXLyYsLIzr16/TsWNHRo4cWeH5NMrtCjS1zmm1A6gVCopvqB1CraG1kA9Ab5EPQMuyt3Kv0vG/pH1l8L497vOuUl/VSUbmQghRikYegSuEEKZPHrQlhBBmwERzuSRzIYQoTUbmQghhBkw0l0syF0KI0mpqamJ1k2QuhBClmOrTByWZCyFEKVIzF0IIM2CiuVySuRBClCY3DQkhhBmQkbkQQpgBmc0ihBBmoLLf7VlbSDIXQohSTDSXSzIXQojSpMwihBBmwERzuSRzIYQozVRvGjLVO1drlKIoTJu2hE8//VLtUFShKAozpq9kzeqd5ba9Nn4x8+auViEqda1fH4WP9zh8fYL596tvkZ6eqXZINe67/Ud58rFJZdquZd9gmP98fj9xXqWoqk5TiaU2kWRegbNnLxIUFMbu3QfVDkUVZ89e4qUX57In+lC5bas/2c4vcX+oEJW6Tpz4k9WrI/l80yJ2Ri2nZatmLF26Qe2watSF8yksXbyN4uJifdv/vv+NF4a9Q0J8soqRVZ2FRjF4qU0kmVdgw4avGDy4PwMG9FY7FFVs2vg1fv5P4unVq0z74R9PcPDgUZ55tmrft2iKOnVqy549H1K/fl3y8vJJTk7HwaG+2mHVmNyb+cyaFs7rUwaXad+04TtmzxuBo66BSpFVD43G8KUyRo4cibe3N4MGDWLQoEEcPXqUnTt3MnDgQNzd3dmwoWoDAqPVzBMSErC1tcXJyYkvvviCU6dO0aNHDwYOHGisLo1i1qxXAIiNPapyJOqYMXMUAD/GntC3paRcZcH8cD76OJSIiH1qhaYqKyst+/bFEjbjfaytrQgJeU7tkGrM/P98zuChvWnX3rlM+/urxqkUUfUyRvlEURTOnTvHd999h1ZbknaTk5OZMGECX375JdbW1gQGBvLYY4/Rtm3bu+rDKMn8s88+Y926dRQXF9OzZ0+SkpJwd3dn69atxMfHM26cefyn34sKCgqZPHEp06YH4ahrqHY4qnrqqZ489VRPIiL2MPql2Xy9dxUWFub9ZveLTd9jqbXg6cG9SLycrnY4RlGZ/8Hs7Gyys7PLtdvb22Nvb69fP3fuHBqNhpdffpn09HSeeeYZ6tatS8+ePXFwcADA09OT6OhogoOD7ypuoyTzrVu3smvXLtLS0vDx8SE2NhYbGxuGDh3KkCFDJJmbsN9OnOPS5VQWvb0WgLS0TIqLisnLy2fOW6+oHF3NOH8+kbTUTFwf7ghAQMBTvDn7A7KycmjY0L6Co01bVOSP5ObmMzxgAYUFReTlFTA8YAFLP3gVR52D2uFVi8qUT8LDw1m+fHm59uDgYMaPH69fz87OplevXrz55pvk5uYycuRIBgwYgKOjo34fnU7HsWPH7jpuoyTz4uJirK2tcXZ2ZtSoUdjY2Oi3FRUVGaNLUUO6dW/P/m9X6tdXLP+CzIxr+nLMvSA1NYM3Ji4mMnIpDRvZs3PnAdq1a2H2iRwgfNNk/c+Jl9MJ9JvHxq3TVYyo+mkqMTYPCgrC39+/XHvpUTlA9+7d6d69OwB2dnYMGTKEBQsW8MorZQdAmircsWSUZO7h4cHzzz/P2rVr9a9Of/zxB2FhYQwYMMAYXQpRYx5++CFeeWUoI0eGYmlpiU7XiBUrQtUOS1QTjcbwZP73cso/+fnnnykoKKBXr5KJBIqi4OzsTFpamn6flJQUdDpd5QP+fxpFUYwyv+ann37ikUce0a+fO3eOixcv4ubmdhdnO119gZmwguIbaodQa2gtbNUOoda4VnBB7RBqFXurqs2wyszfbfC+DtaGDU6//fZbli1bxqZNmygoKGD48OHMnj2byZMns2XLFmxtbQkMDGTu3Ll06dLlruI22myW0okc4P777+f+++83VndCCFEtNEaYz9K3b1+OHj2Kn58fxcXFDB8+HFdXVyZMmMDIkSMpKChgyJAhd53IwYgj8+olI3OQkXlpMjL/i4zMy6rqyDwrf4/B+zaw9qxSX9VJns0ihBClVKZmXptIMhdCiFIqM5ulNpFkLoQQpRijZl4TJJkLIUQZMjIXQgiTV5Ubd9QkyVwIIcqQZC6EECZPauZCCGEGNFiqHcJdkWQuhBClSM1cCCHMgiRzIYQweXLTkBBCmAUZmQshhMmTZ7MIIYQZkDKLEEKYBSmzCCGEyZObhoQQwgzIPHMhhDALUjMXQgiTJx+ACiGEGZAyixBCmAXTHJlrFEVR1A5CCCFE1ZjmS5AQQogyJJkLIYQZkGQuhBBmQJK5EEKYAUnmQghhBiSZCyGEGZBkLoQQZkCSuRBCmAFJ5kIIYQYkmRtg586dDBw4EHd3dzZs2KB2OKrKycnBx8eHS5cuqR2KqpYvX463tzfe3t4sWrRI7XBUtXTpUgYOHIi3tzdr1qxRO5x7liTzCiQnJ7NkyRI2btzI9u3b2bx5M3/++afaYani6NGjDBs2jISEBLVDUVVMTAwHDx5k27ZtREZG8ttvv7F37161w1LF4cOHiY2NZceOHWzdupV169Zx7tw5tcO6J0kyr0BMTAw9e/bEwcEBOzs7PD09iY6OVjssVURERDB79mx0Op3aoajK0dGRadOmYW1tjZWVFW3atCExMVHtsFTx6KOPsnbtWrRaLenp6RQVFWFnZ6d2WPckeWpiBVJSUnB0dNSv63Q6jh07pmJE6pk3b57aIdQK7dq10/+ckJDArl272LRpk4oRqcvKyoply5axevVqvLy8cHJyUjuke5KMzCtwu4dKmurzjkX1OnPmDKNGjWLq1Km0atVK7XBUFRISwqFDh0hKSiIiIkLtcO5Jkswr4OTkRFpamn49JSXlni8zCIiLi+OFF17gjTfewN/fX+1wVHP27FlOnjwJgK2tLR4eHpw6dUrlqO5Nkswr8K9//YtDhw5x9epVbt68yddff02fPn3UDkuoKCkpiXHjxrF48WK8vb3VDkdVly5dIiwsjPz8fPLz89m/fz+urq5qh3VPkpp5BZycnJgwYQIjR46koKCAIUOG0KVLF7XDEir69NNPycvLY+HChfq2wMBAhg0bpmJU6nBzc+Po0aP4+flhaWmJh4fHPf8Cpxb5piEhhDADUmYRQggzIMlcCCHMgCRzIYQwA5LMhRDCDEgyF0IIMyBTE0Wt8dZbb/HTTz8BJTejODs7U6dOHQA2b96s/1kIUZ5MTRS1Ur9+/Vi6dCmdO3dWOxQhTIKMzEWt9/777/Prr7+SkpJChw4daNmyJRkZGcyaNUu//db6tWvXmDdvHqdPn6agoIBevXoxZcoUtFr5VRfmTWrmwiRcvnyZbdu2sXjx4jvuN3/+fB566CG+/PJLIiMjycjIkC9MEPcEGa4Ik9CtWzeDRtffffcdx48fZ8uWLQDk5uYaOzQhagVJ5sIklP7CA41GU+bRxAUFBfqfi4uLWbp0KW3atAEgOztbHlks7glSZhEmp2HDhvz2228oisKNGzc4ePCgflvv3r357LPPUBSF/Px8Xn31VdavX69itELUDEnmwuQ8/fTTNGrUCA8PD8aMGUP37t3122bMmMGNGzfw9fXF19eX9u3bM3r0aBWjFaJmyNREIYQwAzIyF0IIMyDJXAghzIAkcyGEMAOSzIUQwgxIMhdCCDMgyVwIIcyAJHMhhDADksyFEMIM/B/CswnX4jFfhgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.892135  0.906393  0.899207\n",
      "1   0.609819  0.634409  0.621871\n",
      "2   0.700234  0.690531  0.695349\n",
      "3   0.694915  0.546667  0.611940\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "\n",
    "test_iter = Data.DataLoader(test_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in test_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DPCNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:26:49.733819Z",
     "start_time": "2020-12-21T08:26:26.160961Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "import utils\n",
    "# from model.TextCNN import *\n",
    "\n",
    "# loading our w2v\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:28:48.883113Z",
     "start_time": "2020-12-21T08:27:00.751922Z"
    }
   },
   "outputs": [],
   "source": [
    "from Dataset.Dataset import *\n",
    "from utils.doc_tool import *\n",
    "row_train = np.load('Dataset/data/train.npy')\n",
    "row_val = np.load('Dataset/data/val.npy')\n",
    "row_test = np.load('Dataset/data/test.npy')\n",
    "train_data = TextDataset(dataset2mat(row_train, w2v))\n",
    "val_data = TextDataset(dataset2mat(row_val, w2v))\n",
    "test_data = TextDataset(dataset2mat(row_test, w2v))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T08:35:48.746658Z",
     "start_time": "2020-12-22T08:35:48.223617Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "\n",
    "class DPCNN(nn.Module):\n",
    "    def __init__(self, embed_dim=200, kernel_num=250, class_num=4):\n",
    "        super().__init__()\n",
    "        self.embed_dim = embed_dim\n",
    "        self.class_num = class_num\n",
    "        self.conv_region = nn.Conv2d(1, kernel_num, (3, embed_dim))\n",
    "        self.conv = nn.Conv2d(kernel_num, kernel_num, (3, 1))\n",
    "        self.max_pool = nn.MaxPool2d((3, 1), stride=2)\n",
    "        self.pad1 = nn.ZeroPad2d((0, 0, 1, 1))\n",
    "        self.pad2 = nn.ZeroPad2d((0, 0, 0, 1))\n",
    "        self.fc = nn.Linear(kernel_num, class_num)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        Compute the forward pass of DPCNN.\n",
    "        \n",
    "        Args:\n",
    "        - x: (batch, len, w2v_dim) torch.\n",
    "        \n",
    "        Returns:\n",
    "        - logit: (batch, 4) the corresponding logits.\n",
    "        \"\"\"\n",
    "        x = x.unsqueeze(1) # [batch_size, 1, seq_len, 200]\n",
    "        x = self.conv_region(x)  # [batch_size, 250, seq_len-3+1, 1]\n",
    "\n",
    "        x = self.pad1(x)  # [batch_size, 250, seq_len, 1]\n",
    "        x = F.relu(x)\n",
    "        x = self.conv(x)  # [batch_size, 250, seq_len-3+1, 1]\n",
    "        x = self.pad1(x)  # [batch_size, 250, seq_len, 1]\n",
    "        x = F.relu(x)\n",
    "        x = self.conv(x)  # [batch_size, 250, seq_len-3+1, 1]\n",
    "        while x.size()[2] > 1:\n",
    "            x = self._block(x)\n",
    "        \n",
    "        x = x.squeeze()  # [batch_size, num_filters(250)]\n",
    "        x = self.fc(x)\n",
    "        logit = F.log_softmax(x, dim=1)\n",
    "        return logit\n",
    "    \n",
    "    def loss(self, y, labels):\n",
    "        \"\"\"\n",
    "        Compute the loss.\n",
    "        \n",
    "        Args:\n",
    "        - y: :torch.tensor: (batch,) the prediction.\n",
    "        - labels: :torch.LongTensor: (batch,) the true labels.\n",
    "        \n",
    "        Returns:\n",
    "        - loss: :torch.tensor: the corresponding tensor.\n",
    "        \"\"\"   \n",
    "        loss = F.nll_loss(y, labels)\n",
    "        return loss\n",
    "    \n",
    "    def _block(self, x):\n",
    "        x = self.pad2(x)\n",
    "        px = self.max_pool(x)\n",
    "        \n",
    "        x = self.pad1(px)\n",
    "        x = F.relu(x) # pre-activate\n",
    "        x = self.conv(x)\n",
    "\n",
    "        x = self.pad1(x)\n",
    "        x = F.relu(x)\n",
    "        x = self.conv(x)\n",
    "        return x + px"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:30:23.433034Z",
     "start_time": "2020-12-21T08:30:23.425440Z"
    }
   },
   "outputs": [],
   "source": [
    "def validation(model, val_iter, val_losses):\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        ls = []\n",
    "        for data, label in val_iter:\n",
    "            data = data.to(device)\n",
    "            label = label.long().to(device)\n",
    "            logit = model(data)\n",
    "            ls.append(F.nll_loss(logit, label).item())\n",
    "        mean_loss = np.array(ls).mean()\n",
    "        val_losses.append(mean_loss)\n",
    "    model.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T08:30:24.059863Z",
     "start_time": "2020-12-21T08:30:24.051399Z"
    }
   },
   "outputs": [],
   "source": [
    "def init_network(model, method='kaiming'):\n",
    "    \"\"\"\n",
    "    Initialize our pytorch model.\n",
    "    \n",
    "    Args:\n",
    "    - model: our pytorch model.\n",
    "    - method: weight initialize method.\n",
    "    \"\"\"\n",
    "    assert method in ['kaiming', 'xavier'], 'Your initialization should be xavier or kaiming'\n",
    "    for name, w in model.named_parameters():\n",
    "        if 'weight' in name:\n",
    "            if method == 'kaiming':\n",
    "                nn.init.kaiming_normal_(w)\n",
    "            elif method == 'xavier':\n",
    "                nn.init.xavier_normal_(w)\n",
    "            else:\n",
    "                nn.init.normal_(w)\n",
    "        elif 'bias' in name:\n",
    "            nn.init.constant_(w, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T09:00:31.493749Z",
     "start_time": "2020-12-21T08:55:06.822273Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DPCNN(\n",
      "  (conv_region): Conv2d(1, 250, kernel_size=(3, 200), stride=(1, 1))\n",
      "  (conv): Conv2d(250, 250, kernel_size=(3, 1), stride=(1, 1))\n",
      "  (max_pool): MaxPool2d(kernel_size=(3, 1), stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  (pad1): ZeroPad2d(padding=(0, 0, 1, 1), value=0.0)\n",
      "  (pad2): ZeroPad2d(padding=(0, 0, 0, 1), value=0.0)\n",
      "  (fc): Linear(in_features=250, out_features=4, bias=True)\n",
      ")\n",
      "epoch: 0\t\t test loss: 0.9178309440612793\n",
      "epoch: 1\t\t test loss: 0.9549059470494589\n",
      "epoch: 2\t\t test loss: 0.8640200098355612\n",
      "epoch: 3\t\t test loss: 0.8344738384087881\n",
      "epoch: 4\t\t test loss: 0.8166944285233816\n",
      "epoch: 5\t\t test loss: 0.8237064480781555\n",
      "epoch: 6\t\t test loss: 0.8548756639162699\n",
      "epoch: 7\t\t test loss: 0.8051247199376425\n",
      "epoch: 8\t\t test loss: 0.8111069997151693\n",
      "epoch: 9\t\t test loss: 0.8107599020004272\n",
      "epoch: 10\t\t test loss: 0.7605505983034769\n",
      "epoch: 11\t\t test loss: 0.8034841815630595\n",
      "epoch: 12\t\t test loss: 0.8359565337498983\n",
      "epoch: 13\t\t test loss: 0.7931731144587199\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.array_tool import *\n",
    "from utils.vis_tool import *\n",
    "import torch\n",
    "device = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')\n",
    "\n",
    "model = DPCNN(embed_dim=200, kernel_num=250, class_num=4).to(device)\n",
    "init_network(model, method='xavier')\n",
    "print(model)\n",
    "\n",
    "# training\n",
    "lr = 1e-4\n",
    "epochs = 14\n",
    "batch_size = 256\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "\n",
    "train_iter = Data.DataLoader(train_data, batch_size=batch_size, shuffle=True,collate_fn=PadCollate(dim=0))\n",
    "val_iter = Data.DataLoader(val_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=lr)\n",
    "# scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.85) # adjust learning rate\n",
    "# scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[3, 6, 8], gamma=0.1)\n",
    "# optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)\n",
    "\n",
    "# train 前先 eval 一下\n",
    "validation(model, val_iter, val_losses)\n",
    "\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "    # train each epoch\n",
    "#     scheduler.step() # 学习率衰减\n",
    "    for data, label in train_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.to(device)\n",
    "        logit = model(data)\n",
    "        loss = F.nll_loss(logit,label)\n",
    "        train_losses.append(loss.item())\n",
    "        \n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "    # val each epoch\n",
    "    validation(model, val_iter, val_losses)\n",
    "    print('epoch: %s\\t\\t test loss: %s' % (epoch, val_losses[-1]))\n",
    "    \n",
    "# visualization\n",
    "vis_loss(train_losses, val_losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T09:00:41.518416Z",
     "start_time": "2020-12-21T09:00:38.963354Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7073529411764706\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEXCAYAAABf36TeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA9S0lEQVR4nO3deVhU5dvA8e+wCioqxqCCWrmUS25oaZmkJqKIgEtuiWWmlmBZuSEumVtqmXtWrqgpLqARYmhFGS7pz9wyNRVNQTYFRGSbOe8fvI0QJoM4DDPdH69zXcwz55znnhHueeY+zzlHpSiKghBCCJNmYewAhBBClJ0kcyGEMAOSzIUQwgxIMhdCCDMgyVwIIcyAJHMhhDADksyFjkajYe3atfTp0wcfHx969uzJggULyM3NLdM+33rrLbp3787GjRtLvf2pU6cYO3bsQ/f/qN2+fRt/f/9/fd7Hx4eMjIxyjEiIAiqZZy7+NnXqVNLT05k9ezZVq1YlKyuLDz74gMqVK7NgwYKH2md8fDzdu3fnt99+w9LS8hFHXP6uXbuGt7c3x48fN3YoQhQhI3MBwF9//cU333zDnDlzqFq1KgD29vZ8+OGHdOvWDSgYlX7wwQf06tULb29v5s+fT35+PgDPPPMMS5cuZeDAgXTp0oV169aRmZnJiBEjyM/Pp0+fPly9epWnnnqKmzdv6vr9+/GdO3cYO3YsPj4++Pn5ERwcjFar5fDhw/Tq1euh+r+fZ555hk8++QRvb286d+5MZGQkY8eOxdPTE39/f7KysgDYvn07/fv3x9fXl86dO7N582YAJk+eTHZ2Nj4+Pmg0Gpo3b84777xD9+7dOXXqlO71LFu2jAEDBqDRaEhOTqZjx44cOnTo0f/HCfE3RQhFUaKiopS+ffs+cJ0JEyYoH330kaLVapWcnBxl+PDhyqpVqxRFUZTGjRsrISEhiqIoyqlTp5TmzZsr2dnZyl9//aW0atVKt4/GjRsrqampxR6HhYUpw4cPVxRFUfLz85UpU6YocXFxyqFDhxQvL6+H7v+fGjdurKxfv15RFEVZtWqV0rp1a+XGjRuKRqNR/Pz8lN27dyuZmZnKK6+8oty8eVNRFEU5fvy47jXc7/WEhYUVez35+fnKkCFDlFWrVinDhg1TVq5cWdJ/gRBlIiNzAYCFhQVarfaB6/z000+8+uqrqFQqbGxsGDhwID/99JPu+a5duwLQrFkzcnNzdaNcfbi5ufHnn38ydOhQvvjiC4YNG0b9+vUN0n/37t0BqFevHo0bN8bZ2RkLCwtcXV1JT0+ncuXKfP7558TExPDZZ5/x+eefP/C1tG3btlibpaUlCxYs4Msvv0SlUjFq1Ci93wshHoYkcwFAixYtuHTpEpmZmUXaExMTGTlyJNnZ2cWSvVar1ZU5AGxtbQFQqVQAKCUcjil8YLVu3bpER0czcuRIMjMzef3114mKiirW36Po39ra+r4//+3GjRv4+vpy/fp13NzcePfddx/4Ouzt7e/bHh8fj62tLVeuXJGDosLgJJkLAJydnfH29iYoKEiX0DMzM5kxYwbVq1enUqVKdOzYkU2bNqEoCrm5uYSGhvL888+Xqh9HR0dOnToFQHR0tK598+bNTJ48mY4dOzJ+/Hg6duzIhQsXimz7KPrXx+nTp3F0dOTtt9/mxRdf5IcffgAKZuZYWVmh0WhK/KDKyMhg/PjxfPzxx/Tq1YspU6Y88jiFKEySudCZPn06DRs2ZODAgfj4+NC/f38aNmzIrFmzAAgODubmzZt4e3vj7e3NE088wejRo0vVR3BwMDNnzsTPz4/ff/8dJycnAHx9fdFoNPTs2ZM+ffqQmZlZbArgo+hfHy+88ALOzs54enri6+tLQkICjo6OXLlyBScnJ5o2bUqPHj24devWA1/nSy+9xAsvvEBAQABXr15l06ZNjzxWIf4mUxOFEMIMyMhcCCHMgCRzIYQwA5LMhRDCDEgyF0IIMyDJXAghzICVsQPQh129QcYOoUJIufTop+GZKpWMQ3QqWToaO4QKxULVrEzblybf3L36dZn6epRMIpkLIUR5UalMc6BgmlELIYSBqLDQe3kYH3/8MZMmTQLg7Nmz9O3bl+7duzNlyhTd5Sni4+MZMmQInp6evPXWW9y5c6fE/UoyF0KIQlQqC72X0jp48CBhYWG6x+PHj2fq1Kns3bsXRVEIDQ0F4MMPP2Tw4MFERUXRvHlzVqxYUeK+JZkLIUQhpUnmGRkZXLt2rdhyvwurpaWlsWjRIt0lKK5fv052djatWrUCoE+fPkRFRZGXl8evv/6qu7rn3+0lkZq5EEIUolLpf0es9evXs2zZsmLtAQEBBAYGFmmbNm0a48aNIyEhAYCkpCTdtYkAnJycSExM5NatW1SpUgUrK6si7SWRZC6EEIWUpnwybNgw/Pz8irU7ODgUebxt2zZq165Nhw4d2LlzJ3D/SzSrVKp/bS+JJHMhhCikNMncwcGhWOK+n8jISJKTk/Hx8SE9PZ2srCxUKhUpKSm6dZKTk1Gr1Tg6OpKZmYlGo8HS0lLXXhJJ5kIIUYghzmFYu3at7uedO3dy5MgR5s6dS69evTh27Bhubm6Eh4fTqVMnrK2tadu2LZGRkXh7e+vaSyIHQIUQohBDzmb5p4ULFzJ37lx69OjB3bt3ddfwnz59OqGhofTs2ZOjR4+WeLcrMJHrmcsZoAXkDNB75AzQe+QM0KLKegZozcZj9V439fySMvX1KEmZRQghCrEoxWyWikSSuRBCFGKqp/NLMhdCiEIkmQshhBmQZC6EEGZBkrkQQpg8CwvTTIumGbUQQhiIqU57lWQuhBCFSM1cCCHMgD4XtaqIJJkLIUQhMjIXQggzIDXzCsjboy1fLXoL52Zv/Os6U9/rh2P1Koybtq5MfdlVsmHl/JG0bPY4FhYqgud+zTffHQXg5U4tmDFhAFaWFmi1CtM+3sK+n06Wqb/ysmXT92zfGoNKpcK1rhNTPxyKY817l/x8/52VODlVY1LwYCNGWT62bPqebVt/RKUC17pqpn3oj33lSsybtYkzp+PQahWeafEEk4KHUKmSjbHDLTcbQ75l06Y9VKpkw5NPujJ12ptUr17V2GE9NFOdzWKaH0F6aPB4LeYGD8HC4v4v0aWWI5s/f5d3R/V6JP0Fv9ePzKxsWnf9gF5D5rB49nBcajniUNWOdUsDePO9lbTvMZmR739OyPKxVKlc6ZH0a0i/n7lCyLpo1m6ayLZdM6hXX82Kpbt0z69bHcXxYxeMGGH5+f1MHBvW7WXdpkls3zXz/9+LcFav+pZ8jZatO6cTGjaD7Ow81nwZaexwy83hQ6f46qsw1q6bQVj4p3Ryb8P0aSuNHVaZGPqGzoZSsaJ5ROwq2bB28RgmfrTxX9cZNrAzvxz5g8VffFvsuQkBvsR+O4dDe+YS+uV71HauUeT5KeP6MmVc3yJtvbu3Ze3m7wH4Kz6VfT+dpG+v9lhbWfFu8BrOnr8GwNkL11CpVNR0rPgjl6bN6hMe+RFVq9qTk5NHUmIa1apXAeDXw38Qe+AM/V5xN3KU5aNps8fZFTm72HvRpm1j3hzlhYWFBZaWFjzdpC4J8anGDrfcnDlzkQ4dWlKr1mMAdOvWnh9+OEpubp6RIysDlYX+SwVisO8TFy9eZO/evdy4cQMLCwvUajUvvvgizzzzjKG61Fk2bwRfbdrPqbNX/nWdOZ/tACiWlAf3fZHmT9flxd7BaDRahg/uwoqP38TvtfkP7NO1dk2uJdz7I76ecBOX2o6k3rrN9m8O6dqnvd+fPy8ncOWv5Id5aeXO2tqKH/Yf56NpG7C2seatwN4kJ6WxYN5Wln/xDjtCfzJ2iOXm7/di5rT1WNtY8VagD/XrO+uej49PZVPIPqbO8DdilOXrmRaN2LgxkuvXk3BxURO283vy8vJJS7uNWm2al+aVA6CFbNq0idDQULp3765L3snJyUydOpXevXszfPhwQ3QLwMih3cjP17Ah9EfquT5W6u17dm1D25YN+CViNgCWlhbY29kCsPWL96hf1wlnp+pAQU3+yl/JDBj56X3LORqNVvezpaUF86cNxeOllvQcNPshXpnxdO7ams5dW7Nz28+8/eZnONdy5IOJA3D6//fhv+Tee/ETY0YuYveeOVhYWPD7mTjeH7uCgYO70OmllsYOs9y0a9eMt8e8QmDgx1ioLOjTtwvVqlXB2tra2KE9NJmaWMiGDRsIDw/Hzs6uSPvrr7+On5+fQZP50P6dsLOz5dCeudjYWGFXyYZDe+bi99p8EhJvlbi9pYWKT1bu5suN+wCwsbGiRrXKAAwY+SlwbzQ/e9EO3XZ/xadQS12DxOR0AOrUqsHJ3wu+GVSvVpnNn7+LChXuPtO4mZb56F6wAV29kkRqSjqt3RoB4NPnBebM3EjarUw+nR8KQGpKBhqtltzcfKbNNN8R6dUriaSmZBR6Lzoye2YIGRlZHIr9nbkfbWTSlCH06PWckSMtX3cy79KuXTP69XsZgJSUNJYs/prq/1+OM0UVrRauL4NEbWVlRX5+frH27Oxsg39iv9h7Km27TaB9j8n4DvuYu9m5tO8xWa9EDhD900leG9SZqlUKPoimvd+f1Z+NKXG7iO+OMXxwF6Dg4Gq3l1oSuf9/2NhYEbFxMnFXk+j16hyTSeQAKSnpTB7/Jbdu3QZgT8RhGjR04cCvS9mycxpbdk6j74BOeHi2NetEDgXvxaTxX+jei8iIQzRo6MKvh/9g/tyvWfHle/+5RA6QlHSTYf5TyczMAmDlim14eb1osqNbAJWFpd5LaSxevJiePXvi5eWluyfo5MmT8fDwwMfHBx8fH6KjowGIjY3F29sbDw8PFi1apNf+DTIyHz16NL6+vnTo0AEnJyegoMxy6NAhxo0bZ4guS1TbuQZh6yaUOEJf+/UP1KnlSMyumSgK/HU9hZHvFT06X3hE/rePPt3GkjlvcGzfAiwtVATN3szlK0kM9H0Bt5YNsLW11pVuAN54dwVnzv316F6gAbRxa8QbI3sy8rVPsLS0wEldnU+Xvm3ssIyijVtj3hjZkzdfW4ClpSVO6mosWjqGt95chKIozJy2Xrduq9YNmTx1iBGjLT9PPOnCm2/2YcArE9FqFdq4NWHq1BHGDqtsDDDEPXLkCIcOHWL37t3k5+fTs2dP3N3dOX36NBs3bkStVuvWzc7OJigoiJCQEGrXrs2oUaOIiYnB3f3Bkw0Mdg/QxMREDh48SFJSEoqi4OzsTIcOHXB2di5543+Qe4AWkHuA3mOqX4UNQe4BWlRZ7wHauIP+UyvPH3xL73Xz8vKwtrbm+vXrDB48mM2bN9O7d2/atm1LfHw83bp1IyAggKNHj7J8+XLWry8YIISHh3P48GHmzp37wP0bbDaLs7Mzvr6+htq9EEIYRilKRBkZGWRkZBRrd3BwwMHBoUibtbU1S5YsYc2aNXh6eqLRaGjfvj0zZ87E3t6eUaNGsX37duzt7XUVDQC1Wk1iYmKJscjwRgghCrPQf1m/fj1du3Yttvw9qv6nsWPHcvDgQRISEjh48CDLly+nZs2a2NnZMXToUGJiYrhfsUSfYxCmed6qEEIYiGKh/8h82LBh+Pn5FWv/56j84sWL5Obm0qRJE+zs7PDw8CAyMpLq1avTvXv3gn4VBSsrK5ydnUlJSdFtm5SUVKSm/m9kZC6EEIVZqPReHBwccHV1Lbb8M5lfu3aN4OBgcnNzyc3NZf/+/bRr1445c+aQnp5OXl4eW7dupVu3brRs2ZLLly9z5coVNBoNERERdOrUqcSwZWQuhBCFGWBapbu7OydOnMDX1xdLS0s8PDwICAigRo0aDBo0iPz8fDw8POjVq+BaUfPmzSMwMJCcnBzc3d3x9PQsOWxDzWZ5lGQ2SwGZzXKPzGa5R2azFFXW2SyNunyp97oXvn+zTH09SjIyF0KIwkpRM69IJJkLIURhJnr2qiRzIYQozFKSuRBCmD7TzOWSzIUQojBFyixCCGEG5ACoEEKYAdPM5ZLMhRCiCCmzCCGEGZDZLEIIYQZkZC6EEGZAkrkQQpgBE73sjyRzIYQoTEbmQghh+hQ5ACqEEGZARuZCCGEGTDOXSzIXQogi5HR+w0mPe9/YIVQIb8dmGjuECuO95unGDqHCcLG/Y+wQKpRqNmW705CplllMdBKOEEIYiKoUSyksXryYnj174uXlxdq1awGIjY3F29sbDw8PFi1apFv37Nmz9O3bl+7duzNlyhTy8/NL3L8kcyGEKMzKQv9FT0eOHOHQoUPs3r2bHTt2EBISwh9//EFQUBArVqwgMjKS06dPExMTA8D48eOZOnUqe/fuRVEUQkNDS+xDkrkQQhSiqPRfMjIyuHbtWrElIyOjyD6fffZZNmzYgJWVFampqWg0GjIyMqhfvz5169bFysoKb29voqKiuH79OtnZ2bRq1QqAPn36EBUVVWLcJlEzF0KIclOKA6Dr169n2bJlxdoDAgIIDAws0mZtbc2SJUtYs2YNnp6eJCUl4eTkpHterVaTmJhYrN3JyYnExMQSY5FkLoQQhZXiAOiwYcPw8/Mr1u7g4HDf9ceOHcubb77J6NGjiYuLu0/XKhRFuW97SSSZCyFEYaUYmTs4OPxr4i7s4sWL5Obm0qRJE+zs7PDw8CAqKgpLS0vdOklJSajVapydnUlJSdG1Jycno1arSw5b76iFEOK/wKIUi56uXbtGcHAwubm55Obmsn//fgYOHMjly5e5cuUKGo2GiIgIOnXqhIuLC7a2thw7dgyA8PBwOnXqVGIfMjIXQojCLB/9GNfd3Z0TJ07g6+uLpaUlHh4eeHl54ejoSGBgIDk5Obi7u+Pp6QnAwoULCQ4O5s6dOzRt2hR/f/8S+1Ap9yvQVDC52qPGDqFCkJOG7nmvubwXf3OxlzFZYdVsPMu0/RPv7NJ73cuLfcrU16MkvwVCCFGYiRafJZkLIURhcm0WIYQwAyZ6bRZJ5kIIUZjcnEIIIUyfImUWIYQwA5LMhRDCDEjNXAghzIBMTRRCCDMgI3MhhDADpbjpREUiyVwIIQpRZGQuhBBmwDQH5pLMhRCiCBmZm49vdh9g3ZpvUamgUiVbJk/xp1nzJ/ly1S527/oZjUZLL+8XeGtMH73uAFIRKIrC+TXrqexSB1dPj2LPp/zvOFd2fYNKpcLK3p5Gr/ljp3a6z570k3v7Nue/Wkt26k1UKhWNhr2KQ8MGACQdPMS1qGhQgYWNDQ0GD6Dq448/dF/l5dCPp9jy5V5UKhVVqtrx9pRXqO36GHu2/8K+3YfJycmjwdOuBEwZgLWN+f9p/bj/JB9O2cgPh+YD8H30b6z7MprcvHxq13Zk+pxXqV69spGjfAgmOs/cRL9QGM7ly/F8uuBrPv9iAtvD5jJytC/vjv2Mn2J+47u9h9m6fRZhu+dx5PDv7I06bOxw9ZIVn8CphYtIOXr/SwlrcnM59+Uamr49mjYzplKzVUsubt5Spj4vbvwah8YNaTtrBk+9OZyzK79Ak5NL1o0bXNq2g+bjxtJmxlTq9erJ2eWfl6mv8pCTncdn0zczcd5rLNr4Pu06NWP1J+Ec/OEk3247wIylo1ny9Xhys/PY/XWMscM1uKtXkljyyS602oIraP9+5ioL5uxg3qLhbAmbTN36TqxcEmHkKB+ShUr/pQIx/+FDKdnYWPPhRyNwUtcAoFnzJ0hJSeO7vYfp6fU89vaVAPDt04lvv/kFzx7tjRmuXuJ/+BHnF57H1tHx/itotYBC/t27AGhycrCwti54Kj+fy9t3kn7uPGgVKterS4PBA7Cys9Ntfm71Oqo/1Rjnjs8DoGg03Dx5kgavDgKgSr262DmruXX6NFXq16PxMH9sqlcreO7x+uSmZ6DNz8fCquL+Omq1WhRFISuz4D3KzsrF2saKHyOP4jPYnarV7AEYPakf+XkaY4ZqcNl3c5k+eSPvjvdl6sQNAERFHKW3X3vquNQEYOTbPUhPu2PMMB+aItdmMQ8uLk64uBSUFxRFYcHHm+jcuQ0pyWm88EIL3XrOzjVJvHHTWGGWSsMhBUk17ewf933eslIlGg4dwom587GuXBlF0dJy0gQA/oqMQmVhQetpU1CpVMTtCCNuexgNhw7+1/7yMjNRtAo2Vavq2mxqVCfnVhqPubWh0mOPAQXv76Wt23Bs1bJCJ3IAO3tbRk/qx6Q3l1K1WmW0Gi1zvwxkzgdrSL+Vycx3vuBmSgZNWj7BsMBexg7XoObO3Ipf/+dp2LiOru1qXBING9fhg8AviY+/ScNGtRk3oY8RoywDEymd/pNB/oLi4+Mf+HydOnUe+HxFkJWVTXDQKhITUln55UQ+GLek2DoWBri9lDHcuXadq998i9tHM7BTO3F93/ecXbGK1jOCuXnyFJqsLNJ+PwuANl+DjUNBkv5t1ly0+fnkpN4k/Y8/uL5vPw4NG1DXq+d9+1EV+lqqycnh/Op15Ny6RfNxYw3/Isvoyp8JhK7+jiVbJlDb9TEitv7M/Enr0ORrOHH4PJMXDMfa1oolH37NppV7eOM9X2OHbBDbt/yMpaUFvf3aE389Vdeen6/h55gzLP9qDI6OVVj66W5mz9jCwiUjjBjtQzJQ+WTZsmXs2bMHKLiN3IQJE5g8eTLHjh3D7v+/6QYEBNCtWzdiY2OZO3cuOTk59OjRg3HjxpW4f4Mk81GjRhEXF4dareafd6VTqVTs37/fEN0+MgnxKQS8/QlPPlmH1euDqVTJhtq1HyM5OU23TlLSTZyd/6VsYWJunT6DQ8MGugOedbq8xKUtoeRn3gGtlicHDcDxmeYAaLKz0eblA9AqeDJw/zILQN6dO1hXLjgAlnsrDdsaBaWr7NSb/L5kOXa1a/HM+PewtLEpvxf7kI4f+oOnWzxBbdeCbxU9+r3A2s924VJfzXMvPYN9lYLym7unG6Froo0ZqkFF7DpCdnYuQ/rNJz8vn5ycPIb0m0+NGpVp//zTPPZYwZ3qe/k+x5g3lhk52odkgFweGxvLgQMHCAsLQ6VSMWLECKKjozl9+jQbN25ErVbr1s3OziYoKIiQkBBq167NqFGjiImJwd3d/YF9GGRo+fXXX/PEE08wf/58vv/++yJLRU/k6WmZvO4/i5e7tWXBp4FUqlSQaDp3dePbiF/IysomNzePXWE/0eVlNyNH+2hUqV+P9HMXyE3PACD1f79RyekxrKtWoUazpsTv/wFtfj6KVsuF9RuJ2xH2wP2pLC1xbPEMN2J+BuDOX9fISkig2lNPkZd5h5PzF1KzTSuajH7TJBI5wJNPu3Lm+EXSUm8DcCTmNOo6jnTv04HY/SfIyc5DURQO/3Sahk3qGjlaw1n39ftsCZvMpu0TWLRiFLa21mzaPoEBQ9z55effSfv/OvmP+07SpHk9I0f7cCws9F/05eTkxKRJk7CxscHa2poGDRoQHx9PfHw8U6dOxdvbmyVLlqDVajl58iT169enbt26WFlZ4e3tTVRUVIl96D0yP3LkCOnp6UVG2h4exae4AVSpUoVZs2axbds23NxMK+Ft3bKPhIQU9u87yv5992Z/fLUmiJe7tWPwK9PIy8unc1c3evu8aMRIy+Z2XBwX1oXQZsZUqjd5GlfPbpxc8AkWllZYVbanacDbANT19uJy6HaOfzgLRaulct26PDGgX5F9PfXGa8X23/DVwVxYv4FjUz8EFTz1xnCs7O24GhFJTupNUo//Rurx33TrP/PBOKyrVDHkSy6TFm0b4TvkJYLfXoG1lSVVHOyZvGA4LvXVZGZk8cGwRWi1Wp58yoXXJ/U2drjl7sWXmpOYmMbo15egaBVq1XYkeOYgY4f1UEqTpDMyMsjIyCjW7uDggIODg+5xo0aNdD/HxcURGRnJ5s2bOXLkCDNnzsTe3p5Ro0axfft27O3tcXK6Ny1YrVaTmJhYYiwq5Z91kPuYMGEChw4don79+vc2VKnYsGFDiR08Crna+0+p+695O1buSP+395rLe/E3F/uKffC4vFWz8SzT9g1W/qT3uu/mn2DZsuLlpICAAAIDA4u1X7hwgVGjRhEYGIifn1+R56KjowkPD8fT05OYmBgWLlwIFJRoVq9ezerVqx8Yi16/BUePHmXPnj1UrmyCJwAIIUQplGYyy7Bhw4olZaDIqPxvx44dY+zYsQQFBeHl5cW5c+eIi4uje/fuQMHsLisrK5ydnUlJSdFtl5SUVKSm/m/0SuZ16tSRRC6E+E8oTTL/Zznl3yQkJDBmzBgWLVpEhw4dgILkPWfOHNq3b4+9vT1bt27Fz8+Pli1bcvnyZa5cuYKrqysRERH07du3xD70SuZt2rRh3LhxdO7cmUqVKuna/61mLoQQpkplgGkhq1evJicnh3nz5unaBg4cyMiRIxk0aBD5+fl4eHjQq1fBOQrz5s0jMDCQnJwc3N3d8fQsuXSkV8186NChxTeUmnm5k5r5PVIzv0dq5kWVtWb+1Ff618zPjehUpr4eJb1+C0JCQgDIz89HURSs//9UbyGEMDemei6gXmGnpqYyYsQIWrVqRYsWLfD399drqowQQpgalUr/pSLRK5nPnDmTVq1aERsbS2xsLG3btmXGjBkGDk0IIcqfSqXSe6lI9ErmcXFxBAQE4ODgQI0aNRg7dixXr141dGxCCFHuVBb6LxWJXuHk5+eTk5Oje3z37t0K96kkhBCPgqmWWfQ6ANqzZ09ee+01+vQpuKTlzp07dRPdhRDCnJTmdP6KRK9kPmbMGGrVqsXPP/+MVqulT58+9OvXr+QNhRDCxFSwGwjp7YHJPDMzkypVqpCWlkbXrl3p2rWr7rn09HSqV69u6PiEEKJcVbTyib4emMyHDh1KWFgY7du3L1IjVxQFlUrF2bNnDR6gEEKUJ7NM5mFhBdet/v3337H4RyEpLS3NYEEJIYSxqEy0zqJXqf9+F3kZPPjf7wEphBCmyixnswwbNoxTp06RnZ1NmzZtdO0ajYamTZsaPDghhChvZjmbZfny5aSlpREUFMTcuXPvbWRlVeROGEIIYS5MtMry4DJLlSpVcHV1ZcWKFURERODi4gLAV199RXZ2drkEKIQQ5clUyyx6faGYPHmy7oCng4MDKpWKqVOnGjIuIYQwCrM+nT8uLo6JEycCULVqVYKCgrhw4YJBAxNCCGMw65F5fn4+mZn3bgZw584d9LinhRBCmBxTvWqiXqfz+/r60r9/fzw9PVGpVERHR+uu0yKEEObELGez/G3UqFE0bNiQgwcPYmVlxQcffIC7u7uhYxP/4OV619ghVBg+g5KMHUKFcS6yvbFDMCuGGnAvW7aMPXv2AODu7s6ECROIjY1l7ty55OTk0KNHD8aNGwfA2bNnCQ4OJjMzk7Zt2/Lhhx9iZfXgdP3Az6C/SytpaWm4ubkREBDA6NGjadmypZwBKoQwSxYq/Rd9xcbGcuDAAcLCwggPD+fMmTNEREQQFBTEihUriIyM5PTp08TExAAwfvx4pk6dyt69e1EUhdDQ0BL7kGuzCCFEIYaYZ+7k5MSkSZOwsbEBoEGDBsTFxVG/fn3q1q0LgLe3N1FRUTRs2JDs7GxatWoFQJ8+fViyZEmJZ93rdW2WP/74o6yvRQghTIKFSv/JHRkZGWRkZBRrd3BwwMHBQfe4UaNGup/j4uKIjIxk6NChRU6+VKvVJCYmkpSUVKTdyclJr3suPzCZh4eHP3BjX1/fEjsQQghTYlWKkfn69etZtmxZsfaAgAACAwOLtV+4cIFRo0YxceJErKysuHz5cpHnVSrVfWcK6jNz5oHJPCoqCoDk5GQuXbpE+/btsbKy4vDhwzRp0kSSuRDC7JRmZD5s2DD8/PyKtRcelf/t2LFjjB07lqCgILy8vDhy5AgpKSm655OSklCr1Tg7OxdpT05ORq1WlxjLA5P5559/DsDIkSNZtGgR9erVAyA+Pl7OABVCmKXS1Mz/WU75NwkJCYwZM4ZFixbRoUMHAFq2bMnly5e5cuUKrq6uRERE0LdvX1xcXLC1teXYsWO4ubkRHh5Op06dSuxDr6mJCQkJukQOUKdOHW7cuKHPpkIIYVIMMc189erV5OTkMG/ePF3bwIEDmTdvHoGBgeTk5ODu7o6npycACxcuJDg4mDt37tC0aVP8/f1L7EOvZO7k5MSSJUt0Xye2bt2qOwIrhBDmxBCzWYKDgwkODr7vc7t37y7W9vTTT7N9+/ZS9aHXh9C8efM4d+4cPj4++Pn5cf36debMmVOqjoQQwhSoVIreS0Wi18hcrVazfPly0tPTqVatmqFjEkIIoynNbJaKRK+R+aVLl/Dy8qJXr14kJibSo0cPLl68aOjYhBCi3FmoFL2XikSvZD5r1iyCgoKoWbMmzs7OvPrqq0ybNs3QsQkhRLkzxOn85UGvZJ6WlsYLL7ygezxkyJAil8QVQghzYVGKpSLRq2YOkJOTozsLKTk5Ga1Wa7CghBDCWCraiFtfeiXzQYMG8cYbb5Camsonn3zCt99+y4gRIwwdmxBClLuKVgvXl17JvH///jz++OP8+OOP5OfnM3PmTDp27Gjo2IQQotyZ6mwWvZL5sGHDWL9+Pe3atTN0PEIIYVSmOjLXq4Z/+/ZtsrKyDB2LEEIYnanOZtFrZG5nZ0fnzp156qmnsLe317X/fSEuIYQwFxUtSeurxGR+/vx5unbtSseOHalVq1Z5xCSEEEZT0aYc6uuByXzHjh18/PHH1K9fn6tXr7Jw4UJefPHF8opNCCHKnZWFadbMH5jMQ0JC+Oabb3B2dub48eMsWrRIkrkQwqyZ5cgcwNnZGYDWrVtz69YtgwdUEXyz+wDr1nyLSgWVKtkyeYo/zZo/yZerdrF7189oNFp6eb/AW2P66HU7J2NTFIVtn2ymVv3adOrfpdjzx/cfJWbb96hUYG1rQ++3++DauN599qSf3OxcdizaQvzFayiKQo83vGn2fAsAzh89y951kWg1GlQWFni+7kXjtk0euq/SetW7CYO9nkZR4GpCBlMW/8LN9OxSr1MajtUqMf/9Trg4V0arheAlv3D8bBIAvTs3YES/Z0BRuJuTz0efH+L0hdQyvcbyFh19iGVLt2BhocLBoQofzXqbevVqGzush2aqNfMHfgj9M1FZWloaNJiK4PLleD5d8DWffzGB7WFzGTnal3fHfsZPMb/x3d7DbN0+i7Dd8zhy+Hf2Rh02drglSrp6gy8nruDUT7/d9/nkvxKJ/Go3w2eP4p2VE+gy2IOQmWvK1Oe+jVHY2tny/ldBjJj7NuFLt5OenEb2nbtsmRfCKx8M5p2VE+j//mA2z1lPTtbDJ8rSaNawJm/0bc4r70Xg9VYYcfEZjPNvU+p1Smv62x04euYGPUaF8cGCGJYEdaaSrSVPuDgwcUQ73gjeS++AXazYcoLlwV3L1Fd5y87OYeKEz1iydCJh4Yvo3KUds2evNnZYZWKql8At1TeK0oxC9+3bR0hICFevXi3SvnXr1tJ0We5sbKz58KMROKlrANCs+ROkpKTx3d7D9PR6Hnv7Stja2uDbpxPffvOLkaMt2cHdB2jr8SzPdGp13+ctra3o++4AHGoWXNrYtXFdMm/dJj8vH4DvN3/HkjELWfzWfDbM+IqM1PQi20eH7CE6ZE+RtjO/nKRdj4JbY1VX16CR21Oc/Ok4mnwNPgH9cH68YNSmru+MosCdjDuP8iX/qzN/ptLtje1kZuVhY21JrZqVuZWRo/c61lYWBI18lvClvdm93JeP33uRKvbWRbb/+L0X6fNyQ91jSwsVnZ+tS2jUeQDOXrrJlfgMOrm5kpunZcpnB0i+dReAU+dTeKyGHdZWpvNFX6PRoigKmbcLpi5nZWVja2NdwlYVm1lOTTx37hxt2twblWRnZ9OmTRsURUGlUvG///3vvtstXLiQ06dP06BBA1auXMnEiRPx8fEBYMuWLQwYMOARvoRHy8XFCRcXJ6CgPLHg40107tyGlOQ0XnihhW49Z+eaJN64aaww9eYT0A+AP387f9/nHWvVxLFWTaDg9UasCqdJ++ZYWVtxLPoIN+ISGLNkHJaWlhyOjGXHoi28PmvUA/tMT06julN13eNqj1UnPSWNytWq0PKle79P0ev34OTqpOu/PORrFF7uUI/Z73QkN0/DZyHFf4f/bZ1Rr7RAo1HwDSy4M8x7w9z44PW2zFh+8F/7q1GtEhYWFCnT3Ei5Q63HKvNd7BWuJ927YF3QyGf5/vBV8vJN57pHlSvbMX3GaAYNmkT16lXRarVs2jzX2GGViel8lBb1wGQeHR39UDuNiYkhLCwMKysrhg4dyvDhw7GxsaFHjx4oSsX6avJvsrKyCQ5aRWJCKiu/nMgH45YUW8fC0lT/24vLzc5h28LNpCWnMXx2QbL+4/Dv/HX+CssCPgFAq1XIy8kFYMOHq7l1I5Xbt24D8HvsKWrUqon/9Dfu+39sYXHvvdJoNHy7Kpxzv57lzY/HGPqlFbPv4FX2HdzMK56NWTurO13f2MY/Q77fOi89WxeHyja80LoOANbWFqSmFSTp7Yu8sbG2oLa6Cu1b1uY132Yc+z2JlVt+u28MGu29Du1srfj4/Rep7VSZ4cHfGeQ1G8r5c1dYuSKUiG+XUK9ebUI2RPDO2PmEhX9qEseT7seQs1kyMzMZOHAgn3/+Oa6urkyePJljx45hZ2cHQEBAAN26dSM2Npa5c+eSk5NDjx49GDduXMlxP+hJFxeXhwr475E7wOOPP86qVat4/fXXcXR0NIn/4IT4FALe/oQnn6zD6vXBVKpkQ+3aj5GcnKZbJynpJs7OjsYL8hFKS7rFumlfoq7nzMj5Y7C2tQFAq9XyUv+utPcuuA5Pfm4+dzMLvk77T38DQFdi6Ta0h25/1Z1qkHEzg6qOBXctz0hJp3aDgt+lrNtZbJq1FkWBtxePo7JD5fJ5kUC92lVxcrTn2JlEALZ/d4GZAc9TrYotabdzSlzH0kLFrFWH+enoNQDsK1lha1NwHKnfuG+AgjLL4ZMJ7Nz3J1BQZgFwqGJDRmbBB6FzzcrcSIkDoLZTZVbN6MbFv9J4deIecnI15fBOPDoHDhyndeundQc8Bw/pwbx5a0lLu02NGiXftb4iMlT55MSJEwQHBxMXF6drO336NBs3bkStVuvasrOzCQoKIiQkhNq1azNq1ChiYmJwd3d/cNyGCNrT05OhQ4dy8uRJABo1asTixYt59913i9XQK5r0tExe95/Fy93asuDTQCpVKkhsnbu68W3EL2RlZZObm8eusJ/o8rKbkaMtu6yMO6z6YCnNO7ZgcNAwXSIHaNz2aX6NOkT2nYLRZ/SGSLbO31jiPpt0aM6RyFigoORy/tgfNHmuGfm5+awJWkmNWjV5Y+7ock3kAGpHez6b9BI1HGyBgpkk56+k6RJ5Sev8fOw6Q72bYG1lgUoFs9/pyPuvtX1gnxqtwo9HrjGwx9MAPPV4DRrWq87hkwlUq2LDpvk9+e6XOMbN+9HkEjlA02ZP8uuvZ0hJSQNg/74juLqqTTaRA1iWYsnIyODatWvFloyMjGL7DQ0NZfr06brEnZWVRXx8PFOnTsXb25slS5ag1Wo5efIk9evXp27dulhZWeHt7U1UVFSJcet9PfPSCAgIwM3NjcqV7/2xurm5sXPnTtasKdtMCUPbumUfCQkp7N93lP37jurav1oTxMvd2jH4lWnk5eXTuasbvX1Mc879tfNX2bFoC++snMChiF9IS77FmV9OcuaXk7p1Rnw8hnae7clISWfFu4sAFdXV1en/weAi+yo8Ite1+fcgfOk2Pn1zHopWS88RvalZ5zGOf3+Ua+f/Ii83X1e6ARgw4VVqPVHHYK/3b0fPJLJyywk2ftwTjUZL4s0s3p65j+aNajLnnY70Dtj1r+sALP/6NyaNeJZdy3ywsFBx9tJN5n11pEgfEz/9uVi/05fHMufdjnzbxQ9FURi/MIbMrDzeGtiSOk6V8Xi+Ph7P19et7z85qsgHTEXWvn0Lhr/hyzD/YKytralWrQrLlk82dlhlUpoLba1fv55ly5YVaw8ICCAwMLBI2+zZs4s8Tk1NpX379sycORN7e3tGjRrF9u3bsbe3x8nJSbeeWq0mMTGxxFhUigkUsXO1R0te6T/g26vJxg6hwpjwVoKxQ6gwzkW2N3YIFYqFqmmZtp93Qv9jhW8/8dx9R+EODg44ONz/20mXLl3YsGEDrq6uRdqjo6MJDw/H09OTmJgYFi5cCEBsbCyrV69m9eoHT/k0yMhcCCFMVWlq5g9K2iU5d+4ccXFxdO/eHSg41mhlZYWzszMpKSm69ZKSkorU1P+N+UzHEEKIR8DaQv+lLBRFYc6cOaSnp5OXl8fWrVvp1q0bLVu25PLly1y5cgWNRkNERASdOnUqcX8yMhdCiELK6+YUTz/9NCNHjmTQoEHk5+fj4eFBr169AJg3bx6BgYHk5OTg7u6Op6dnifuTmrkJkZr5PVIzv0dq5kWVtWa+9Hf95/oHNvUoU1+PkozMhRCiEFO9ApUkcyGEKKSiXXNFX5LMhRCiEGtzvDmFEEL818jIXAghzIAkcyGEMAOSzIUQwgxYVrA7COlLkrkQQhRiqqfFSzIXQohCTOiufUVIMhdCiEKkzCKEEGZADoAKIYQZkGQuhBBmQJK5EEKYATmdXwghzICJTmaRZC6EEIVJmUUIIcyApYkmc1P9RiGEEAZhoVL0XkorMzOTXr16ce3aNQBiY2Px9vbGw8ODRYsW6dY7e/Ysffv2pXv37kyZMoX8/PwS920SI3Mbi4e7+7W56V2/krFDqDB8IusbO4QK406+3EKvsKrWZbttnKHKLCdOnCA4OJi4uDgAsrOzCQoKIiQkhNq1azNq1ChiYmJwd3dn/PjxzJo1i1atWhEUFERoaCiDBw9+cNyGCVsIIUyTlUr/pTRCQ0OZPn06arUagJMnT1K/fn3q1q2LlZUV3t7eREVFcf36dbKzs2nVqhUAffr0ISoqquS4S/tChRDCnKlKkaQzMjLIyMgo1u7g4ICDQ9GKwuzZs4s8TkpKwsnJSfdYrVaTmJhYrN3JyYnExMQSY5FkLoQQhZRmwL1+/XqWLVtWrD0gIIDAwMAHbqsoxWvuKpXqX9tLIslcCCEKKc3IfNiwYfj5+RVr/+eo/H6cnZ1JSUnRPU5KSkKtVhdrT05O1pVmHkSSuRBCFFKaA4n3K6foq2XLlly+fJkrV67g6upKREQEffv2xcXFBVtbW44dO4abmxvh4eF06tSpxP1JMhdCiEJU5XQJXFtbW+bNm0dgYCA5OTm4u7vj6ekJwMKFCwkODubOnTs0bdoUf3//EvenUu5XoKlwzhs7gApBo+QaO4QKQyUTsXRkamJRVa27lmn7Ezcj9F63pWOvMvX1KMnIXAghCjHRE0AlmQshRGFybRYhhDADJprLJZkLIURhpZmaWJFIMhdCiEJM9dC6JHMhhChEauZCCGEGTDSXSzIXQojCyuukoUdNkrkQQhQiI3MhhDADMptFCCHMgKneA1SSuRBCFGKiuVySuRBCFCZlFiGEMAMmmsslmQshRGGmetKQqZ65Wm527fqB3r0D8fEZy8CB4zl16oKxQyp3iqIQNGkpa1bv0rVlZNzBt/c4Tp/604iRGU909CF8er+Ln+84hvlP5erV/941xX/c/xvuz72ne7zmiyj6en+Ib4/prFoecd97WZoCVSmWikSS+QNcunSNBQvW8tVXH7Jr1xLeemsAgYFzjB1Wubp48RrDX5tBVFSsri0m5hgD+k/k0uV4I0ZmPNnZOUyc8BlLlk4kLHwRnbu0Y/bs1cYOq1xdvZLEZwvD0GoLEvaBn06z77v/sXHrJLaGB3Ps1/Ps2/s/I0f5cCxUit5LRSLJ/AFsbKyZNSsQtdoRgObNG5KSkkZubp6RIys/X2/ag1+fznh6Pq9r2xQSydx5gaidahgxMuPRaLQoikLm7SwAsrKysbWxNnJU5Sf7bi5TJ61j3IS+urYf95/As2c77OxtsbW1xtu3A5ERR4wY5cNTqfRfKhKD1czj4uKws7PD2dmZbdu2ce7cOdq0aUPPnj0N1eUj5+rqjKurM1BQapg7dzVdujyLzX/oDzd42psAHDp4Stf2xVdTjRVOhVC5sh3TZ4xm0KBJVK9eFa1Wy6bNc40dVrmZ/eFm+vTvSKPGLrq2xBu3aPfcU7rHaucaJCWmGSG6sjNUjvb39yc1NRUrq4K0O3PmTK5evcrKlSvJy8vjtddeY8iQIQ+9f4Mk83Xr1hESEoJWq6V9+/YkJCTQrVs3duzYweXLlxkzZowhujWYrKxsJk36jBs3UvjqqxnGDkcY2flzV1i5IpSIb5dQr15tQjZE8M7Y+YSFf4qqog3XHrFtW2KwsrLAp8/zxF9P1bVrtdpi61qa6JFEQ5QrFEXh0qVL/Pjjj7pknpiYyLhx49i5cyc2NjYMHDiQ5557joYNGz5UHwZJ5jt27CAyMpKUlBR69erFoUOHsLW1pX///vTr18+kknl8fBKjR39EgwZ12bBhNpUq2Ro7JGFkBw4cp3Xrp6lXrzYAg4f0YN68taSl3aZGDQcjR2dY34QfIjs7l8F955CXl09OTsHPTzWpS0pKum695KQ01M6mWYYzxOfxpUuXUKlUvPnmm6SmpvLKK69QuXJl2rdvT/Xq1QHo3r07UVFRBAQEPFQfBknmWq0WGxsbXFxcGD58OLa29xKgRqMxRJcGkZZ2m1dfnUyfPi8TEDDI2OGICqJpsyfZtCmSlJQ0HnusOvv3HcHVVW32iRxgw5aJup/jr6cywHcWm3cE8dOPJ/lyRSR9+nXE0sqCb8IP4u3bwYiRPjxVKcbmGRkZZGRkFGt3cHDAwcGhyHodOnRgxowZZGdn4+/vT48ePXByctKto1arOXny5EPHbZBk7uHhwauvvsqGDRsIDAwE4I8//iA4OJgePXoYokuD+PrrSBISUoiOPkh09EFd+7p1s/4Tf7ji/tq3b8HwN3wZ5h+MtbU11apVYdnyycYOy6g6vdSCP8/HM2zQfPLy8nHv3AKv3s8ZO6yHolLpn8zXr1/PsmXLirUHBAToch9A69atad26NQD29vb069ePuXPnMnr06H/0/fBfC1SKgSaD/vrrr7Rr1073+NKlS/z111+4u7s/xN7OP7rATJhGyTV2CBVGaUZP5u5O/n9vjvuDVLXuWqbt03L36L2uRfYLeo3Mjx49Sl5eHh06FHxbWbt2LSEhIXTo0IHZs2cDsHz5chRFeegyi8H+IgoncoAnn3zyIRO5EEKUH1Up/jk4OODq6lpsKZzIAW7fvs38+fPJyckhMzOTsLAwFixYwMGDB7l58yZ3797lu+++o1OnTg8dt5zOL4QQRTz6I6CdO3fmxIkT+Pr6otVqGTx4MG5ubowbNw5/f3/y8vLo168fLVq0eOg+DFZmebSkzAJSZilMyiz3SJmlqLKWWTLyovVe18G6W5n6epRkZC6EEIWY6kBBkrkQQhSiqnCX0NKPJHMhhChCRuZCCGHyTPWSDJLMhRCiCEnmQghh8qRmLoQQZkCFpbFDeCiSzIUQohCpmQshhFmQZC6EECZPThoSQgizICNzIYQweaW5nnlFIslcCCEKkTKLEEKYBSmzCCGEyZOThoQQwgzIPHMhhDALUjMXQgiTJwdAhRDCDEiZRQghzIJpjsxN5IbOQgghHsQ0P4KEEEIUIclcCCHMgCRzIYQwA5LMhRDCDEgyF0IIMyDJXAghzIAkcyGEMAOSzIUQwgxIMhdCCDMgyVwP33zzDT179qRbt25s2rTJ2OEYVWZmJr169eLatWvGDsWoli1bhpeXF15eXsyfP9/Y4RjV4sWL6dmzJ15eXqxdu9bY4fxnSTIvQWJiIosWLWLz5s3s2rWLrVu38ueffxo7LKM4ceIEgwYNIi4uztihGFVsbCwHDhwgLCyM8PBwzpw5Q3R0tLHDMoojR45w6NAhdu/ezY4dOwgJCeHSpUvGDus/SZJ5CWJjY2nfvj3Vq1fH3t6e7t27ExUVZeywjCI0NJTp06ejVquNHYpROTk5MWnSJGxsbLC2tqZBgwbEx8cbOyyjePbZZ9mwYQNWVlakpqai0Wiwt7c3dlj/SXLVxBIkJSXh5OSke6xWqzl58qQRIzKe2bNnGzuECqFRo0a6n+Pi4oiMjGTLli1GjMi4rK2tWbJkCWvWrMHT0xNnZ2djh/SfJCPzEtzvopKmer1j8WhduHCB4cOHM3HiRB5//HFjh2NUY8eO5eDBgyQkJBAaGmrscP6TJJmXwNnZmZSUFN3jpKSk/3yZQcCxY8d47bXXeP/99/Hz8zN2OEZz8eJFzp49C4CdnR0eHh6cO3fOyFH9N0kyL8Hzzz/PwYMHuXnzJnfv3uW7776jU6dOxg5LGFFCQgJjxoxh4cKFeHl5GTsco7p27RrBwcHk5uaSm5vL/v37cXNzM3ZY/0lSMy+Bs7Mz48aNw9/fn7y8PPr160eLFi2MHZYwotWrV5OTk8O8efN0bQMHDmTQoEFGjMo43N3dOXHiBL6+vlhaWuLh4fGf/4AzFrnTkBBCmAEpswghhBmQZC6EEGZAkrkQQpgBSeZCCGEGJJkLIYQZkKmJosKYNWsWv/76K1BwMoqLiwuVKlUCYOvWrbqfhRDFydREUSF16dKFxYsX88wzzxg7FCFMgozMRYW3dOlSfvvtN5KSknjqqaeoX78+t27dYtq0abrn/358+/ZtZs+ezfnz58nLy6NDhw5MmDABKyv5VRfmTWrmwiRcv36dsLAwFi5c+MD15syZQ7Nmzdi5cyfh4eHcunVLbpgg/hNkuCJMQqtWrfQaXf/444+cOnWK7du3A5CdnW3o0ISoECSZC5NQ+IYHKpWqyKWJ8/LydD9rtVoWL15MgwYNAMjIyJBLFov/BCmzCJNTo0YNzpw5g6IoZGVlceDAAd1zHTt2ZN26dSiKQm5uLm+99RYbN240YrRClA9J5sLk9O7dG0dHRzw8PBg5ciStW7fWPTdlyhSysrLw9vbG29ubxo0bM2LECCNGK0T5kKmJQghhBmRkLoQQZkCSuRBCmAFJ5kIIYQYkmQshhBmQZC6EEGZAkrkQQpgBSeZCCGEGJJkLIYQZ+D+gYV2O4GNcoQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.845361  0.907080  0.875133\n",
      "1   0.539394  0.515942  0.527407\n",
      "2   0.690083  0.726087  0.707627\n",
      "3   0.655738  0.388350  0.487805\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in val_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-21T09:00:52.993862Z",
     "start_time": "2020-12-21T09:00:50.216090Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.716236722306525\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.865801  0.913242  0.888889\n",
      "1   0.605422  0.540323  0.571023\n",
      "2   0.657447  0.713626  0.684385\n",
      "3   0.629630  0.453333  0.527132\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in test_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TextRNN_Attention"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T08:58:47.571083Z",
     "start_time": "2020-12-23T08:58:30.319783Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "import utils\n",
    "# from model.TextCNN import *\n",
    "\n",
    "# loading our w2v\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:00:57.165597Z",
     "start_time": "2020-12-23T08:59:15.647169Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 0.681 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    }
   ],
   "source": [
    "from Dataset.Dataset import *\n",
    "from utils.doc_tool import *\n",
    "row_train = np.load('Dataset/data/train.npy')\n",
    "row_val = np.load('Dataset/data/val.npy')\n",
    "row_test = np.load('Dataset/data/test.npy')\n",
    "train_data = TextDataset(dataset2mat(row_train, w2v))\n",
    "val_data = TextDataset(dataset2mat(row_val, w2v))\n",
    "test_data = TextDataset(dataset2mat(row_test, w2v))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:01:34.698657Z",
     "start_time": "2020-12-23T09:01:34.687685Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class TextRNN_Att(nn.Module):\n",
    "    def __init__(self, embed_dim=200, hidden_size=128, num_layers=2, class_num=4, dropout=0.5):\n",
    "        super().__init__()\n",
    "        self.w = nn.Parameter(torch.zeros(hidden_size * 2))\n",
    "        self.lstm = nn.LSTM(embed_dim, hidden_size, num_layers, bidirectional=True, batch_first=True, dropout=dropout)\n",
    "        self.fc1 = nn.Linear(hidden_size * 2, 64)\n",
    "        self.fc = nn.Linear(64, class_num)\n",
    "#         self.fc = nn.Linear(hidden_size * 2, class_num)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        Compute the forward pass of TextRNN.\n",
    "        \n",
    "        Args:\n",
    "        - x: (batch, len, w2v_dim) torch.\n",
    "        \n",
    "        Returns:\n",
    "        - logit: (batch, 4) the corresponding logits.\n",
    "        \"\"\"\n",
    "        H, _ = self.lstm(x)\n",
    "        M = torch.tanh(H)  \n",
    "        alpha = F.softmax(torch.matmul(M, self.w), dim=1).unsqueeze(-1)  # [128, 32, 1]\n",
    "        out = H * alpha\n",
    "        out = torch.sum(out, 1)\n",
    "#         out = F.relu(out)\n",
    "        out = torch.tanh(out)\n",
    "        out = F.relu(self.fc1(out))\n",
    "        out = self.fc(out) \n",
    "        logit = F.log_softmax(out, dim=1)\n",
    "        return logit\n",
    "    \n",
    "    def loss(self):\n",
    "        \"\"\"\n",
    "        Compute the loss.\n",
    "        \n",
    "        Args:\n",
    "        - y: :torch.tensor: (batch,) the prediction.\n",
    "        - labels: :torch.LongTensor: (batch,) the true labels.\n",
    "        \n",
    "        Returns:\n",
    "        - loss: :torch.tensor: the corresponding tensor.\n",
    "        \"\"\"   \n",
    "        loss = F.nll_loss(y, labels)\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:01:35.512817Z",
     "start_time": "2020-12-23T09:01:35.507854Z"
    }
   },
   "outputs": [],
   "source": [
    "def validation(model, val_iter, val_losses):\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        ls = []\n",
    "        for data, label in val_iter:\n",
    "            data = data.to(device)\n",
    "            label = label.long().to(device)\n",
    "            logit = model(data)\n",
    "            ls.append(F.nll_loss(logit, label).item())\n",
    "        mean_loss = np.array(ls).mean()\n",
    "        val_losses.append(mean_loss)\n",
    "    model.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:01:36.440262Z",
     "start_time": "2020-12-23T09:01:36.433293Z"
    }
   },
   "outputs": [],
   "source": [
    "def init_network(model, method='kaiming'):\n",
    "    \"\"\"\n",
    "    Initialize our pytorch model.\n",
    "    \n",
    "    Args:\n",
    "    - model: our pytorch model.\n",
    "    - method: weight initialize method.\n",
    "    \"\"\"\n",
    "    assert method in ['kaiming', 'xavier'], 'Your initialization should be xavier or kaiming'\n",
    "    for name, w in model.named_parameters():\n",
    "        if 'weight' in name:\n",
    "            if method == 'kaiming':\n",
    "                nn.init.kaiming_normal_(w)\n",
    "            elif method == 'xavier':\n",
    "                nn.init.xavier_normal_(w)\n",
    "            else:\n",
    "                nn.init.normal_(w)\n",
    "        elif 'bias' in name:\n",
    "            nn.init.constant_(w, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:09:19.944721Z",
     "start_time": "2020-12-23T09:01:40.674754Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running on device: cuda\n",
      "TextRNN_Att(\n",
      "  (lstm): LSTM(200, 256, batch_first=True, bidirectional=True)\n",
      "  (fc1): Linear(in_features=512, out_features=64, bias=True)\n",
      "  (fc): Linear(in_features=64, out_features=4, bias=True)\n",
      ")\n",
      "epoch: 0\t\t test loss: 0.961559761654247\n",
      "epoch: 1\t\t test loss: 0.9429769651456312\n",
      "epoch: 2\t\t test loss: 0.9066408168185841\n",
      "epoch: 3\t\t test loss: 0.8874556124210358\n",
      "epoch: 4\t\t test loss: 0.8843721124258909\n",
      "epoch: 5\t\t test loss: 0.8619283654473044\n",
      "epoch: 6\t\t test loss: 0.8607065975666046\n",
      "epoch: 7\t\t test loss: 0.8906522420319644\n",
      "epoch: 8\t\t test loss: 0.8541710837320848\n",
      "epoch: 9\t\t test loss: 0.8520463948900049\n",
      "epoch: 10\t\t test loss: 0.8576238236644051\n",
      "epoch: 11\t\t test loss: 0.8159030350771818\n",
      "epoch: 12\t\t test loss: 0.8221836361018094\n",
      "epoch: 13\t\t test loss: 0.8206745684146881\n",
      "epoch: 14\t\t test loss: 0.8298010744831779\n",
      "epoch: 15\t\t test loss: 0.8027831505645405\n",
      "epoch: 16\t\t test loss: 0.8173073638569225\n",
      "epoch: 17\t\t test loss: 0.816224214705554\n",
      "epoch: 18\t\t test loss: 0.7859147191047668\n",
      "epoch: 19\t\t test loss: 0.7598869949579239\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJztnXeYVEW2wH/VPQlmiEMGYciIAoNERRDUlaTiigHDKj7DY9U1vLeuuGvWdX2ru66uKKsuZgWzuAQVJEmQIANDhiEOIEMc4qS+9f7o7pnumQ63c5jz+775pvveunVP33Cq6tSpc5TWGkEQBCF5scRaAEEQBCGyiKIXBEFIckTRC4IgJDmi6AVBEJIcUfSCIAhJjih6QRCEJEcUvSAIQpIjil4QBCHJEUUvCIKQ5KTE6sRNmjTROTk5sTq9IAhCQrJq1apDWuumgRwTM0Wfk5PDypUrY3V6QRCEhEQptSvQY8R0IwiCkOSIohcEQUhyRNELgiAkOTGz0Qu1k/LycgoLCykpKYm1KAlNRkYGbdq0ITU1NdaiCAmAKHohqhQWFlKvXj1ycnJQSsVanIREa83hw4cpLCykffv2sRZHSADEdCNElZKSErKzs0XJh4BSiuzsbBkVCaYRRS9EHVHyoSPXUAgEUfRRIm/PMdbtLY61GIIg1ELERh8lrpq0GICdz4+OsSSCINQ2pEcv1CqOHTvGa6+9FvBxo0aN4tixYwEfN378eD777LOAjxOEcCKKXqhVeFP0NpvN53EzZ86kYcOGkRJLECKKmG6EmPHUN+vZsO94WOvs3qo+T1xxjtf9EydOpKCggNzcXFJTU8nKyqJly5bk5eWxYcMGrrrqKvbs2UNJSQn3338/d911F1AVm+nkyZOMHDmSCy+8kCVLltC6dWu+/vpr6tSp41e2uXPn8vvf/56Kigr69evH66+/Tnp6OhMnTmT69OmkpKRw2WWX8eKLL/Lpp5/y1FNPYbVaadCgAQsXLgzbNRJqH6LohVrF888/z7p168jLy2P+/PmMHj2adevWVfqjT5kyhcaNG3PmzBn69evH2LFjyc7Odqtj69atfPzxx7z55ptcd911fP7559x8880+z1tSUsL48eOZO3cuXbp04ZZbbuH111/nlltu4csvv2TTpk0opSrNQ08//TTffvstrVu3DspkJAiuiKIXYoavnne06N+/v9uio1deeYUvv/wSgD179rB169Yair59+/bk5uYC0KdPH3bu3On3PJs3b6Z9+/Z06dIFgFtvvZVJkyZx7733kpGRwR133MHo0aO5/PLLARg0aBDjx4/nuuuu4+qrrw7HTxVqMWKjF2o1mZmZlZ/nz5/PnDlzWLp0KWvWrKF3794eFyWlp6dXfrZarVRUVPg9j9ba4/aUlBSWL1/O2LFj+eqrrxgxYgQAkydP5tlnn2XPnj3k5uZy+PDhQH+aIFQiPXqhVlGvXj1OnDjhcV9xcTGNGjWibt26bNq0iWXLloXtvN26dWPnzp1s27aNTp068f7773PRRRdx8uRJTp8+zahRoxg4cCCdOnUCoKCggAEDBjBgwAC++eYb9uzZU2NkIQhmEUUv1Cqys7MZNGgQ5557LnXq1KF58+aV+0aMGMHkyZPp2bMnXbt2ZeDAgWE7b0ZGBm+//TbXXntt5WTshAkTOHLkCGPGjKGkpAStNS+99BIADz30EFu3bkVrzSWXXEKvXr3CJotQ+1DehpSRpm/fvro2ZZjKmTgDkAVTGzdu5Oyzz461GEmBXMvaiVJqlda6byDH+LXRK6WmKKWKlFLrfJQZqpTKU0qtV0otCEQAQRAEIbKYMd28A7wKvOdpp1KqIfAaMEJrvVsp1Sx84glCYnDPPfewePFit233338/t912W4wkEoQq/Cp6rfVCpVSOjyI3Al9orXc7yheFRzRBSBwmTZoUaxEEwSvhcK/sAjRSSs1XSq1SSt3iraBS6i6l1Eql1MqDBw+G4dSCIAiCP8Kh6FOAPsBoYDjwmFKqi6eCWus3tNZ9tdZ9mzZtGoZTC4IgRJ/SCt+xkeKNcCj6QmC21vqU1voQsBAQXzBBEJKS+ZuL6ProbFbvPhprUUwTDkX/NTBYKZWilKoLDAA2hqFeQRCEuGPhlkMArNqVRIpeKfUxsBToqpQqVErdrpSaoJSaAKC13gjMBtYCy4G3tNZeXTEFIZHIysryum/nzp2ce+65UZRGEILDjNfNDSbKvAC8EBaJBEEQhLAiIRCE2DFrIvySH946W/SAkc973f3www/Trl077r77bgCefPJJlFIsXLiQo0ePUl5ezrPPPsuYMWMCOm1JSQm//e1vWblyJSkpKfz9739n2LBhrF+/nttuu42ysjIMw+Dzzz+nVatWXHfddRQWFmKz2Xjssce4/vrrQ/rZguALUfRCrWLcuHE88MADlYr+k08+Yfbs2Tz44IPUr1+fQ4cOMXDgQK688kqUUqbrdfrR5+fns2nTJi677DK2bNnC5MmTuf/++7npppsoKyvDZrMxc+ZMWrVqxYwZ9rAYxcWSNF6ILKLohdjho+cdKXr37k1RURH79u3j4MGDNGrUiJYtW/Lggw+ycOFCLBYLe/fu5cCBA7Ro0cJ0vT/++CO/+93vAHukynbt2rFlyxbOP/98/vznP1NYWMjVV19N586d6dGjB7///e95+OGHufzyyxk8eHCkfq4QATSxiQ8WChKPXqh1XHPNNXz22WdMmzaNcePG8eGHH3Lw4EFWrVpFXl4ezZs39xiH3hfeggPeeOONTJ8+nTp16jB8+HB++OEHunTpwqpVq+jRowePPPIITz/9dDh+liB4RXr0Qq1j3Lhx3HnnnRw6dIgFCxbwySef0KxZM1JTU5k3bx67du0KuM4hQ4bw4YcfcvHFF7NlyxZ2795N165d2b59Ox06dOC+++5j+/btrF27lm7dutG4cWNuvvlmsrKyeOedd8L/I4WIoTBv0osXRNELtY5zzjmHEydO0Lp1a1q2bMlNN93EFVdcQd++fcnNzaVbt24B13n33XczYcIEevToQUpKCu+88w7p6elMmzaNDz74gNTUVFq0aMHjjz/OihUreOihh7BYLKSmpvL6669H4FcKQhWi6IVaSX5+lbdPkyZNWLp0qcdyJ0+e9FpHTk4O69bZl4xkZGR47Jk/8sgjPPLII27bhg8fzvDhw4OQWhCCQ2z0giAISY706AXBD/n5+fzmN79x25aens5PP/0UI4mEWJKIXjei6IWoo7UOyEc91vTo0YO8vLxYi+FGrFKAClUk0jMsphshqmRkZHD48GFRVCGgtebw4cNkZGTEWpRaTSI9w9KjF6JKmzZtKCwsRBLPhEZGRgZt2rSJtRi1EnGvFAQ/pKam0r59+1iLIQi1CjHdCIIgJDmi6AVBEAIgEb1uRNELgiAEgXjdCIIgCHGDKHpBEIQgSCT3SlH0giAIAZCI7pWi6AVBEJIcUfSCIAgBIF43giAItQTxuhEEQRDiBr+KXik1RSlVpJRa56dcP6WUTSl1TfjEEwBOl1Ww79iZWIshCIILyeZ18w4wwlcBpZQV+D/g2zDIJFTj5rd+4oLnf4i1GIIgkKReN1rrhcARP8V+B3wOFIVDKMGdn3cfi7UIgiAkMCHb6JVSrYFfA5NDF8cc2jCidSohBHImzuCeD3+OtRiCEFZqq9fNP4CHtdY2fwWVUncppVYqpVYGG49837JPOfnMWRQf2BnU8U6Ol5QzeUEBhpF4Ny2RmJG/P9YiCEJEqG1eN32BqUqpncA1wGtKqas8FdRav6G17qu17tu0adOgTrb1TBb19Em+/ObroAUGeGr6Bp6ftYkFWyQBhiAkIo99tY57PpIRoxlCVvRa6/Za6xytdQ7wGXC31vqrkCXzQvfcQZTqFEp2Lg+pnhMl5QCUVogZSBASkfeX7WLGWhkxmsFvhiml1MfAUKCJUqoQeAJIBdBaR80u7yQrM5MNOofelm1hqlFMN4IgBE4iuVf6VfRa6xvMVqa1Hh+SNCbISLWQZ3Tkeut8sFWANbhsiAlkXhMEIY5ISvfKeEMpxeFGPamrSqn4ZX2sxREEoZZRW71uok7d9gMBePy1dzlwvCTG0giCUBupbV43Uad79x4c1vXorbay5cCJqJ134/7jHHdM4gqCICQKCanoWzWqS57RiVxLQch1BTKfMvLlRfzm36F5+wiCIESbhFT0GSlWVhud6GzZy4GiA0xbsTtq516zR8IRCIKQWCSkom9WP5083QmAr2b8h4c/z6ek3O/CXEEQhLCRSO6VCanoM1KtrDU6AJCr7P705bbAFj4loouUIAixJxF1R0IqeoDjZLLVaE2uY+GUTWLWCELCcex0GaUViTUaF/fKKJNndHRMyGrKbYl38YXIsK3oJH/7bnNCDa1rK7lPf89v3kpMBwdxr4wSeboTTdRxzlJFTJoXXEgEUQXJx01vLeOfP2zjyKmyWIsimGD5Tn/pLoRQSWxFb9gnZHurAt5ZsjO2wghxg4zuBMGdhFb0m/RZnNFplXZ6QRAEoSYJrehtWFmrOwQVyTKBzGtCgIhtXogGifScJayi79OuEWCfkO2udpKGhCYQBEHwRMIq+v8b2wOA1UZn0lUFZ6tdMZZIiBcSyRtCSFwS6TlLWEXvHDXlGR0ByLUUBDWUSqDRl2CSRBpSC0I0SFhF71wf9QvZ/KIb0duylUiumRLlkXgkUo9LECJJwip615WweUYnclUBFYbkfxWqkMZZEOwkrKLv0DSz8vNqoxM5lgMYJw+bPt7Z2UvE5cyCIAiBkLCKPiPVymcTzgeqFk7pwhURO590DhMPMd0Igp2EVfRQ1SvP1+2xaYVl76rYCiQIghCHJLSid3KaDDbrtlj2m1f0iRhqVAgMsdELgp2kUPRgd7NM2b8aIjQhKypDEIREJWkU/WrdCUtpMY9P+SrWoghxgtjoBcGOX0WvlJqilCpSSq3zsv8mpdRax98SpVSv8IvpH+eE7KntPwV0nIzuBUFIdsz06N8BRvjYvwO4SGvdE3gGeCMMcpmic/N6lZ+36VYc13UiFslS7L2CICQqfhW91noh4DUzgNZ6idb6qOPrMqBNmGTzS/2M1Co5sLDWCC6SZaIgjY0gCMEQbhv97cAsbzuVUncppVYqpVYePHgwzKe2Z5zqpnZD2Wn/hQMw3946ZTmvzN0avGCCIAgxJGyKXik1DLuif9hbGa31G1rrvlrrvk2bNg3Lef99a9/Kz6uNTqQoA/avMX383mNn/PaUF2w5yCs/JO9IIdmQcY8guBMWRa+U6gm8BYzRWpuPQxAGzmvbqPKzc0KWvStNH//8rE188NPucIsVEcRyIwhCMISs6JVSbYEvgN9orbeELlLwHKYBe4ymULiCVbuOUlZhzqd+pSQnTirEqVIQ3DHjXvkxsBToqpQqVErdrpSaoJSa4CjyOJANvKaUylNKme9OR4A83ZGK3SsY+/oSnpi+PpaiCDFCBj5CJEnEkXWKvwJa6xv87L8DuCNsEoXIaqMzV5xcRjOO8vOuev4PSCAS8PkyzZ9nbKBHm4Zc2atV2OqUnr0g2EmalbFOnBmnelu2UVJh81ouVkrAiGR2lATmzUU7uO/j1WGtM96v9Pp9xabNi0L8kIgLrpNO0a/XOWhLKrmWbT6V+YoY2eW/Xf9L0MeKH33ysOfIaUa/8iPP/GdDrEWplbw2fxs5E2fUmncq6RR9KWmUNelOrirw2aM7fLIsajK5UloLe3Bf5+2NtQhxx5FT9ucvb8+xGEtSO3nx280AEU0/Gk8kvKL3NIwqbX4ePS0FWLR3040QPeZtKorJeRNwhC1EGenRJwgN66bV2Fba4jwyVSntjD1ejwvH7V2z5xjr9xWHoSZzROqR/M/afX573cdOl0nvU0gaQolsmohtQ8Irek9c+x/7sLi74d2t3zW5+NYDJ4M6z5hJixn9yo8BHRPOiZwKm8Gp0oqQ67n3o9XcPzXPZ5lxbyzjqkmLQz6XYCcRJ/QEdxLpFialot+pW3BUZ3G2bQvlNv828Q37jzNvc2zMC6Ew4YOfOeeJb6Nyrk2/nAj62ATsAAm1hFCezUR6rpNS0YMiz+hIl/JNdP6T1xhrbmwLslcfTaoPGedsPBDW+ncfPs3JMIwQqnOmzPNcyeerCun77Pe12uVUJ5S6SB6cvfFgzDCJOBpLCkXfumGdGtvyjE50VnvJwkQkS8AWQ8PbGwsL6PynmUEfbzM0t0xZztIC32GG3lm8g1EvL/K6f8gL87hu8lK3bZf/cxF//DI/aNkAjp0p97j9j1/mc+hkGWUmRl2BEC821F+KS7zuk5zFiUVFmJ/RaJMUiv7mge1qbMvTnbAoTQ/LDlN12MLcqywptzF7nTmf+edmbqLc5v/83np/R06VsXDLQW54cxkb9h33evyT32xgw37v+4Ea+9ftPc5HCRL0LZ6Yt6mIgX+Zy1w/o654aZRqK2ZGVGsLj9HpT7OYn4DmXSdJoeg9UblCVtnDC5dVGJT6WCkbbvPBX2ZuZMIHq1i+I3wLs0rK/Pcq/vbd5rCdL1GJh6G100NpTWH0vLIE8wTyjKzcac+rNH+zPYdGIjbOSaHoG2em1thWTBYFRkt6W7bxS3EJXR6dRddHZ3ut45QXO3KwFB49Y5fDi9kiGK5/Y6n/QvFIlF+MeHoR46DNEXwQyrOSSPc2KRT9tX3O4vYL29fYnqc7kmvZxsC/zPFbx4mSwBSyP2+eSPQqvXm+uJ7L23ljOeHpb3gcT4rZDMdLyk2Htvb20+Jh1BGvlJTbGPv6EvJlNBQ2kkLRWyyKxy7vXmP7aqMzTVUxrTnkt47qL6TWmjcXbufgiVKP5Y+e8hxCYfXuo+RMnMGB4/bj8vcW8/7SnX7P7zxnpIilLg3lZxUdL2Hs60u83gef5w3+tD6Z8P4qrpm8NCxrGISarNtbzKpdR3nym8iFGQ/HZHgi9U+SQtF7wzWSpStFx2t6Q3z00242u/SYN+w/zp9nbuSBaTUjKu45UtOTZ/tBu3vme0t3AXYFD/DK3K089nXVA7tsu/eeYLAK8cufXVe1xl9XceUue+PnDV+923eX7mTVrqNMWxE/E8LrHPe2wsQEur+7kWijmWgQzUsSbvfK0gpbXCYySmpFv0m3pUTbI1m6cs1kz7bu699YyuNfr2PC+6s4UWLvrR0/U7PXNviv89y+f523l4v/tsDUoquPl+/2aiYK9gH/88yNVXV4eXLjOaZHHIuWdGzcfzwiayXCifN5iEaXJdzrGJ75zwaumbyUbUXBLzCMBEmt6CtIYZ1uT66lwG37bg89cgCbTfPe0l3MXv9LZWz0XYdP+T3PeodL42aTq0d7PPmdx+2uylhrzfzNRQEr6Lmbivhmzb6adQdUi3dshuZfCwo4XeZdWRw5VUYXkwvVkhWz1zuabZzN0Ix8eRF3vLsiimcNnojOYwRQd3U5fL2SG/fbdcDR0+FzwggHSa3oAVYbnThX7SCVwHoxRQ6b8PGSwI4z+/zcMmV5jaiOrvOlX+XtZfzbK/gwCB/2Wev219gWrl7z7HW/8JdZm/jrbO9unKt2HfW5CGrd3mLeWrQ9PAL54KXvt3g004WKp0uptWbLgZoNfTxNuhqOh8DpLhivRHP0aeZU3sp4urVxdLvdSHpFn2d0IkOV002F18brupL2jYV2pXWmzGa6h7Zwy0HueM89va7rMHLfMbuCevSrdaEJGmbKbHY31GOnqyaj/zp7E38yuXpWa83l//yRZ2ds9F/Y7biAigPw/rJdPDDNc7C2fy0o4N0lOwG76a3XU9+ZiovkjS9X7+WylxbGLCSzGaJtIssvLA5qHYlTzGisHq4tVsNaoOjtE7JOO/0jX3hXSCcCsF1+ubpmWN8TAfb+tdbMWLvf5bu54zbsO86qXYG9QOGyRVocXdQKl+HHa/MLTI88dh42F5LCSagv+5lyz+sj/jJrU2Xy+Cemr6f4TDknTd4/TxI5VyRvKzIXMymeevqR4opXf+S6f4Ww9iOC1yiQqoO5V/E275T0in4vTSjSDSsV/cfLw9Oz96YUAn0mXpm7NeBzj3plEWNfD+wFCteDZ7XYf6Hho0JfQ2/X45wvkM+6vDRQG/cfD/vagHFvLDNVZ5y9wwDsPHSKBVsOxlqMhCMUM1EiZU5LekXvjGTpDIUQSQLtNWvcewuuz1woPb5IDnn/Odd+HT25FpZVGHyyYo/5iUhHwb9/7z1vgJONv1TF4MkvLGbky4t4bb7/e+rpPX7Jy/k2HzjhdQTgEV+XOcpduqEvzufWKct9lnE+n5EcTRSfLueGN5axv/hM0HVE49I5r0Ewp3Iem0jhLWqBorfb6TtYfqEB4QtF7PUBCeAlqv5Am2kolhT4X/wVSTY7Jhw9BYF79Yet/OHztfxnbc3JYF/M8FJ+4ZaDlDly7M7MrwoQt/eYXYmsNfGiebqiL7uMoiZ+vpZjwXpImNAS/hrdYHuUWmu3eZJ44cvVhSzdfpjJ8wv8F/ZDvFq3fN2yygbES6FeT33H7z6uuTYn0vhV9EqpKUqpIqWUx1lBZecVpdQ2pdRapdR54RczNFbrTgA13CxDwfOMe2iPZkHRKXo99R37jnnvDd345k9+6ymtsLHj0Cm3hV3eHs45G4KLae+pukOO1cLe4vsMe3G+m3Kq6lVV1XbTW8vYeegUP+8+yi1TlvPmoqroo+v2FrN4m++Gblb+/oDiC01d4Z5uMlq281CflQ9/2k3u09/79Nc2DM2D0/JYtSswL5sDx0t4Z/EODp0s5R9ztgRkIjviaDRDS+gRuS59WYXBhz/tqvRwi7YtvfhMuUf350iTYqLMO8CrwHte9o8EOjv+BgCvO/7HDWuNDhhakau2sYBeYanzrR9rhj+2GQZf/ByY3c41d+UHy3ZRfKacp75ZH5IL3JyNRczZaPf+2Pn8aMD95Vm58wi3vbOCq3u3Ji0luEGdpx6L8rEPYMehU8zdWNMrxbX44m2HGfrifI/HX/5Pe9rGG/qf5VWu3374s/fKA2Td3mKy0lPIaZLpuYAPXR1p/eGMpLj94Ck6NavnsUzxmXK+XL2XeZuLyHv8sspw0/5CYt/53krWFhYzdcUeNv1yggHtszm/Y7bX8mUV9pSWjTLTKuec1vsIl+0X54KpCDS6r83fxj/mBD4vBvG96NAffhW91nqhUirHR5ExwHvafhWWKaUaKqVaaq0DG79HkFPUYYtuYw+FEKYglU6TgivvOsIfBILrs+xUxt+uD2/mKHDXd86Vwe8u3cVdQzp4LH+ipDyo+DLVz1Vjn8ltvnDGETJznLNMaYWNvs/ModTDfXMr71Kps2FxNpZeK48AWmu0tsdxqs7eY2coOuF7fUCFzaD3M9+7bZuZb+6VdJrEnF5k3nI1HD1VRu9nvqdOqpUz5Ta361QRhonySMw1HakeoyrM99Apc7w1CWZ69P5oDbiOfwsd2+JG0YPdzXK4dSWOKdBYi+ORWHQYvF2J6/+1zGeSEk+iejLFmCGU3326rIJjp8tp5SHLmGvds/J/Cch9NlT8PWH+eqtXvrqY/L3Fbspz0daDNKqbVtkA+SLcWbs8sW6fvUHwNIHtoX0yTVRj3YRf08cl4VD0nn6ax6unlLoLuAugbdu2YTi1eVbrzoxT88lRv7BTt4zquX2x18UeH8lIwt6q3uxhNSfUzDTliW6PzeKiLk0rvztj8PtS3K75Y8Pxe8e9sYy1hcVee93OF/mDZYGPtvzhSUk4tzn3vDRnC/df2tmtzI1vLmOJn7SPzqB4YA+Yd/HfFngsp7y0GJ7uQbANajDKMBz6LhKmm2CqjFPdHRDh8LopBFyNpm0Aj7MNWus3tNZ9tdZ9mzZt6qlISHRt7tlWCTUzTsULrhOHkZiEck7EeVux6bT1urLXx2SwkxMlFZSUG25mJjMZeN5xrEa1l3MWDHQEUFXen+eNs+hKkxOSv/90TUCyeMPX2gB/Sr46zmxVgVD97B8s22X6GoQDbw1QvJHAZveACIeinw7c4vC+GQgUx8o+/4cRXb3u26rbcFJn1IhkGVdE4KEb+/oS9h47E5BL16Dnf/Bbxpcnx9Lt5hSZ8yUL9mVzVSU9nvzWY3z4QOue5SfPb48nvq20XXsakThttJPmmfPwMiNfOHRmtENphCJyqMp337EzPPzZWlMhLQI91Rc/F5oKdBhvDYgZ98qPgaVAV6VUoVLqdqXUBKXUBEeRmcB2YBvwJnB3xKT1g6eJKycGFvKNDmF1sQw3X3gIqxAOrjBh040FznfhsJckLoFwoqTCY/iBYN63sgrDq5JwtfOfV22y0xta66hn+HId9USqb+1rstTipXU6XlLu13sl0IVd1dcTTPwin2kr9/CjH1dcgAojsLmM//lkDfM8jIKdxOs4xozXzQ1+9mvgnrBJFEFW607caZlBOmWUkhZrcaJGDU+DOCHc7mo2L/X5WpfgiS6PzqJVg4xwiATAfVPz+GbNPu/eOz5YWxi42QbCOzgM6jZ50Hi7Dp/iohfm8+QV3bmiV6vKOR1vLN5mbmR4ptxGQ3Mi1Lgu/f88t/K+7Dh0isw0K83qe773MczGGTJJtTLWX2uaZ3QkVdn4tfVHGhJfiQFqI8G+N96O89Rr1lqzJggb975ic+GNzZgHXBfIVDd5aTR9nvmeSfM8mxSvfHWxKTmqE4421JMrasHBk2z6xfNE/Y5Dpzx+duIMaDd3UxFjJi1mzCTPv81V9hIPHj1PTl/P87M2VX4vr9A1cjlA4PMEw16cT//n5nrdb6b3v8bRMEdy0VcwJJei93NjVxpdOa3TeT71LfIy/psf0+/j9dSXuNv6FUMsa2hECIs8hIAJVRlVP9ybv3eoNu5DJ0tZtNXzcL26Wcw125cnDniIj3/4VBkvfOs9vr8vvP20cIyWDp2suY7ikr8tYMQ/FtnPXe3kw1wWuvlag7Fo6yGfvXlXyauf4+U5W3lnyU4mL6gywQ55YR5P/2dDjXrCbUbxt9Bs9+HTlJRH3q01GMLhXhk3+PJ0ADhCfQaWvsq5lh2cq3bQw/F/ZGpVxp1C3YR1Rnvyjfas0/b/R6gfadGFAPD2Ansy3YSjZ3vjm8vYcuAk258bVWPfJkd1zoMVAAAgAElEQVRWsdUuo4bdAYRi3nLAfV7h0MnSsMypxNtkIMB3631PdIM9IuR3Lp5c1X/HS3M8B6T7cNlunrjiHLdjzDbwWmtTvf8KP6O3QEJvRJukUvSlJlrT42SyxDiXJZxbuUq2Pqc4x7LTTfmPcFH+e3V2pfJfYPQiX7cnfqddkh/vphtPZUNfIOdUxr50p6tJZsgL84I+15wNB9hfzWzka9LTprVH85F7OOjQfr+zplBzzZrJWXD/VM+JYgKhcjLX5H3X2lyj4M9G71ZHnDW0SaXos7OCm2A9TiZLjXNYyjmVyr8ep2so/+GpK/k9n7LBaMc021C+sg2imKww/gIhEL6vFpAtUj16pez13PDGspDqWbDlIHdXj8Vj8vzemDRvm8fJ9mB+9qGTpTSok+px35wNB7j34yrZZ6/bXyMgXCjsOXKasxrXDb4CL+G+q+NxIZm/qpX3HAyHTpbSJCvdhICxJakUfb+cxmGr6wR1WWZ0ZxndXXr+J7nCuozrrfN4KvVd/pjyEbOMfkyzDWOZcTY6uaY8Eg5vLoyh2ugVdmWwfGfgafFc8RcvHgJX0GsLi7kqt+aEpT8z5urdR+ndtlHl99IKG32fncM1fdrUKHuypIJ7PnJvoCZ8EHiD5YvBf50XlFeSE7fOdBCmG1+jPud8h6crOmvdL/xmYLuAzhcLkkrRR5rjZPGh7VI+tF1Kd7WT66zz+bX1R66yLmGX0YxptqF8bhvCAcLX4Ag18bSa1xtbi06SH2KCiHh3q/Mk3mw/C7/y9xa7KXrnRKOnwGfVlXygLNt+mNZeYhGFC7cEPpWmG3OYvb2BTHDH2yMjXdAg2aBzeLJiPP1LX+O+snvYq5vwh9RPWJL+O95KfYFfWVaSQvSCaAmwxUvcnle9uC6Gi+JgE5dUI2fijKCO8+SC+PjX630eU10JVoWYDkoEn4x7YxmD/+p/3uJ0me+VzV+ZXFBYeYxJTf+vBQU+r32l6cbDHJBy+xy/XXrp0YdIKWlMNwYx3RhE24oDXGedz7XWBVxqXc1B3YDPbEOYZhsaV4HUkhWzibnDzTWTl4StrmAUratrZkm5rYabqUf149IFNoz48Pp+wMNE7P7iM3Roap8He2CauYnaKj2vmLp8N4O7NK0cUXgyr7z4ne9UllWmm3i4SsEhij6M7NbNebHiel6quIaLLGsYZ53HndYZ/DblG34yuvGN7XzyjI5s1m0pl0sfdk556BFGg60xamA8MeC5uQG7+Q15YV6lf39AOXPDzBoPq4Av/tsCU7Z7Z2+64OBJlu+wz6WcLqtg4hf5gI+cAgHgqRF2vdbe8j87Ka2I3bUVbRMBbFj5wTiPH4zzaMpRxloXcb11Hs+mvg1AqU5ho27LWqMja3UH1hod2KZbY4glLSRc88rWVswq+VIXhe4vFEEi4FSyX+dVrUJ2Hdks236YgR2ygxoxOU0333lIu/nCt5u5Z1gnU/V0fXR24CcPE6LoI8xBGjHZdiWTbVfQRh2ipyqgp2U7PdV2fm39kVuUPTDWaZ3OOp3DWqODowFoz07dAvHXr10s2OI5nHQoeAoa9+yMjYy/IIcUa3J0LlS1/9UJpDE7WVpB3u5jXNi5SUAyeAonPWbSYsZf0I5f967pzRRNRNFHDUWhbkqhbspMY6Bji0EHtZ8eage9LAX0sOzgJutc7kiZBUCxrku+0Z61uiObjTacJoNSUinRafb/2P+X6jRKSKWUNEpIS+iRQUNOcKn1Z4ZbVtBAneIr24VMt53PSULwsU4gPKWRjFRs9wpDk2KNSNVB4UwRGWv+Z1oe3204wNJHLibVZENYdKLEY9LvNXuO8eC0Y6LoazMaCwW6NQW6NV8ZFwJgxUYXVUgPy3Z6qe30tBRwp2UGqSnm7Xvl2lrZCJSQxmmdTr7uwHKjG8uNbuyIs5FCM45ymXUlIyzLGWjZSIoyKNRNOKnr8Fzqv3k05QNm2AYw1TaMVboL8SR7NLgvgFwCtR3XNtG1gQzkidnoCNr2xy/yfYYkdrLlwAkue2mh2zaN9pgfIVbUekV/dsv6bDSRNi9a2LCyUbdjo60dnzAMgHTKaKMOkkE56ZSRrsrJoIx0x/cM5fjv2JahHP8d3xuqU1xkWcNYqz0Y1UHdgOVGV5YbZ7PC6Mom3Tbqo4Cz1AGGW1Yy0rqcPpatABQYLZlsu4LZtn6s0+0B6Km2M846jyutS7g2ZSHbjFZMtQ3jC9tgiUFUi5jy4w6f+z2Nen7YVDU6Wrr9MGM9LAbzxJ4jdjOPGSUPsP2g50Qk49/2v0AuWtR6RZ8SShbjKFFKGgW6ddWGoLy8NB3VPvpZNtPfson+lk2MttofxOO6LiuNLpU9/nzdIQJeQZrOai8jLMsZYV3BORZ7Dtd1Rg4vll/LbKMf23TNF3Gt7sjaio48W3Ezo63LuN46n0dTP+QPKVP53ujDNNswfjR6JLS5KlbEY+Azb3iKTukJV1/2j5dXhWj4bFUhL17bKyIukp567kdPl7NiZ1X8o0AC3UWCWq/o/3ZdrxrDruRE2c1EttZMtV0MQCsO0c+yiQGWTfSzbObiVLuf8hmdRp7RieW6G8uNrhzWDajAgoEFGxZsWLFp52f7n4GFCqwuny1oFD3VdkZYVzDcsoKOlv0YWrFKd+aZ8pv41uhHoW5mSvrTZPCpbSif2obSSRVyvXU+Y60LGW1dTqFuwqcVF/Gp7SL2EdgEWm3G0JptRcmRlyGW3bX/9ZBnuLq57Ynp0U3lWJ1aregHdmhMyzBmEko09tGEr40L+doxP9CY4y49/o3ca/kSa0roPaAKbWGp0Z0p5SP5ztaHgzTyf5APtuk2/LniZl6ouJ5fWVZxvXUeD6Z+zv0pX7DQ6MlU2zDmGudFaK2CJpMS6nGaeuoM9TlFPXWa+pyhnjpNFmdYozuyzDibeJ9LyN9bzLgQA7VFA1OhBxyXOl7jzZwqjZ0PPdRyRV8n1Zow2eqjwRHq863Rj2+NfgBkcZpelgLqcYYUR1/dikGKsmFBu22zYnP811WflY1dRgvmGOdFJMpnGanMMAYywxhIm4oirrUu4DrrAiZb/8Epnc5J6lBOCmU6hXJSqMBq/04K5Y5t9u9WKpyftV36uqqkUnnX57RDsdv/W5V/xbPOyOGtilHMMAbG7eK495fuirUIpjCTUtCZsD1e3+ZQQzyHSnw+gVHCouI5OkXsOUldFhs9Yi2GKQp1M16quJaXK8YyxLKGiyxrSaeMNGUjlQqXP8d3VUEmJZXbU7CRpqo+n9YZnKAuJ6jDXp3Ncc7ihFGXE9TluLb/P6Ht+4/rTMf/upSSyijrcu6wzuQfaa/xsJ7KuxWX8ZHtYo7HWUjrGR4CmMUjN//7p1iLEDIbYuzwkfSK/pGR3fiLS35JV5RScTvUE4LDwMJ8ozfzjd4xk2Gq7WKm2YZykWUNd1hnMjF1Kr9L+ZJPbEN52zaC3bp5zGRLZsoqDL/vc23t2iW9oj+nVQOv+yyq9t54IbJolwane8VObk+ZxU3WOdxq/Y5vjb68VTGqVq4JiCRdHp3F2PN8u1AmcmCyUEh6Re/LezI7K1169ELE2aBz+N/y3/J/jOPWlG+5yTqXkekrWG104q2KUcw2+mEjjpaoVqKpxxmaqaM0U8doyjGaKeffUZo5vjdWx9lstGWe0Yt5Rm+26tbEqgH7/OfCmJw3UNbtLebc1t47oeEmaRX9qkcvJX9vsc9YHk1cUg+mWBQV8Z5hQkhoimjECxXjeLXiKsZaF3G7dSaT0l6hUDfh7YoRTLMN9RDqQZPFGRpwigbK8ef8zEkaunyvQyk2FzfXCse0eIW2f6787nCRrcCCTVspx4oCmqjiSqXuVOJ1VM04OSU6lSLdkCIasUW34ZiRSW9LAX9M/Zg/8jGFugnzbLnMM3JZanTnDPHh2bb78Gn+szY+5iWWbT8cf4peKTUCeBmwAm9prZ+vtr8B8AHQ1lHni1rrt8Msa0BkZ6UztGszftruf8ZeEKLJGTL4wPYrPrJdwiWWn7kjZSaPpX7A/Smfk2d0or46TX2qlHqK8p70vkJbOEYWxTqTM6S7eUClYMOqHP+xkeLYV/Xf5uZBdFzX4aBuSJFuRB6dKDIa2hW6Q6kX6YYc1A05Tl089dhbcJih1jUMs+RxtXURv0mZQ6lOZZlxNvMMu+LfpVsEdc0yOUMHtZ+Oah8dLPvoqPbRUe0nWx3HQFWu33Cu7zBw/2/DQoMP6/FWxRlsafY1Hsd1XeYZuXxn68thoqd0we4IEk38KnqllBWYBPwKKARWKKWma61dl6rdA2zQWl+hlGoKbFZKfai1rtkdiDKeEkZ7IhrXvW+7RqzcddR/QaFWYGDhe6Mv35f1pacq4LaU2bRX+zmuM9lNM4qNTIrJpFg7/2dVfXdsO0UGoZhJFAYpGCg0ZXhODG6WX8hmqu1iptouJo1y+lk2McySxzBLHk+mvseTvMd2owXzjVx+MHqz3OhW7Zyalhyho0ORd1AOhW7ZT0tVla+3QlvYpZuzXbfkZ6MzCu1w5zUq3X2r3H6rPhcfNLCQihWNRRl0VXu4LHUVz6ZMYYXuxixbf2bb+kUlFWi0F+Sb6dH3B7ZprbcDKKWmAmMAV0WvgXrK7pSeBRyB2OTRm3bXQFq55Kesnm3HFa2ju8BC5gMEb6zVHXmw/J6on1djoTwC4SPKSGWx0YPFRg+e5Te0VQcY6lD6N1rn8l8pszmt01lsnMMpMhyKfT+ZqiqC5XFdhwLdmiXGORQYrSjQrdimW7FbNw/T2gRNN7WHkdbljLAs56nUd3kq9V1+Njoxy9afWUZ/0yu3A8USZU1v5mq1Bva4fC8EBlQr8yowHdgH1AOu11p7H29GkAEdst2++1T06MohVPeW9VkTZBLpYV2bmg6AJAi1kd26Oe/ZhvOebTgZlHK+ZQPDLHlcZFmDVRkUGK1YYXSjQNsVeoHRioM0ILKTuopNui2bKtryEtfQUe1lhGUFI63L+VPqR/yJj1hn5Nh7+kY/93hTIWJEeT7QjKL3dKWrSzkcyAMuBjoC3yulFmmt3VYJKKXuAu4CaNu2beDSBoEvRQ+QarUw7a6BdG1Rj9ynv/dbX3qKhdIK9zbshv5tTSl6WYUrCFBCOvOM3syL4VoHTxTo1kyytWaS7SrOUgcqlf5DqZ/wEJ+wxWjNLGMAs2z92aTPIpRGaM7GIsYPah8+4f1gZsxWCJzl8r0N9p67K7cBX2g724AdQLfqFWmt39Ba99Va923atGmwMgeEGRP9gA7ZNKyb5r8gcMdg95uT/+RlbqYiX9TPiD8np9YmZReE2sQe3Zw3bZdzddnTDCz5J0+U38oR6nOv9Utmp09kXtr/8HjKewy15JFB4AlTou3Pb0bzrAA6K6XaA3uBccCN1crsBi4BFimlmgNdge3hFDRYhnZtyvgLcnhnyc4a+8IRptVML71bi3pcmduKcf3act4z/kcNgiDED7+Qzbu24bxrG04TirnMupLLLCsr5xpKdSo/Gd1YaPRkgdHL1DqCuPO60VpXKKXuBb7F7l45RWu9Xik1wbF/MvAM8I5SKh/7L3xYa30ognKbJsVq4ckrz/Gs6P0c+98XdeBfC3y3V4qak6xtGtVxy1HZokEGdw81l0A42piKDCgIAgCHaMBHtkv4yHYJ6ZQxwLKRIZa1DLGs5dHUD3mUD9mvG7PQ1pMFRk9+NM71GOMo2mZcU7YErfVMYGa1bZNdPu8DLguvaOGlZ5sGrA1wsrV+hn93M0/3q1m9dDdFH21d+l+D2jNlse+MPE5EzQtCcJSSxkKjFwuNXgC05DBDrGu5yLKGkdblXJ8yH5tWrNEdWWDrxUKjJ2t0RwwscelemRR8fOdAlu84wm3vrKjcdll338Glureszz3DOrLj0Clm5v8C1FT+ClVDkedkZ/Lz7qqM8Fnp0b3MgXQWpEMvCOFhP9lMsw1jmm0YVmz0UgVcZLVHUr0/5QseVJ9zTGfyo9GDrWeuxO65Hh1qjaLPTE9hWLcqn9idz4/2WX7BQ0Npl51Zecy2ohOU2zRr9hxzK1ddqf5hRFd2VMshmZEaj3FMBEGIFDas/Ky78HNFF17iWhpygsGWfLuZx7qWsvLuUZWn1ij6QGmXnen2vVOzegDkVVP01blzcAf++cO2iMkVbmprND9BiCbHqMc3xgV8Y1wAFZqRDRtzdRTPLxmVA6Rumnvv3LVH371lfVI9BFHzpUyb108Pm2zBIKYbQYg2igplzp07XIii98AN/c/yuu+Knq14/PKqYZdrPHtduc08/uLh//eQDgHU5pAjAOUtel4Qkh9R9B74y9U9ve6zWBT/dWF7rI5p81C9pH53id3t8uJuzWhar6p3n51pb/HPad2ACzs18VmHUvDVPYMqvwdijkmEHv0P/3tRrEUQhLAS7feu1in68RfkMKhTtv+CJlFePgPcen47OjbN5O6hHWsct+yRSyh4bhQt6teM1b38j5fw1T2DGNa1KZee3ayG4q7euHRrUd/NBOTpIXL+5m4t6nn8HV+7NBTxRoem8ZVrVRASjVqn6J+88hw+vGOgx32je7bktZvOM1WP60Kjlg3syvrXve1Bj5yKuEHdNOb+79DKiVxXWjTIqBwVVK8P4KzGdXn7tv7UTUvx2fq/PC6XD27v77eHsPmXE4A9teL250ZxVW4rvrpnEL3bNrTLWie0ELWJxKOjz3b73rmZNCRCciNeNy5MutGckgd44ZpevDRnC1aLIjsrnS3PjiTVGrgdx7V3bnY45yyX9/ivKmP07DtWtUCrY9PMGsfUr5PKoZP29AAWi+If4+wBpV4el0tB0SnqV1P0rRpkMLRbMz76abdPWXY+P5qciTPMCR4n3DG4A4bWPDfTnjQ+AaxXghASouiDZGyfNoztU5WIOC3Fw+DIg+Z+8dpe1PMX3Mxke+G6jNr1TDcPbMeOQ6eZsngHStnFqOPw5a/uNVQ3LYUebRpw9JR7jpjUFAtX927tV9EnKjaXAKQSBkJIdkTRRwBfnjTX9PGcpT4YVWNxGw1U1aCU4rHLz+b8jtms3HWEfy3YzohzWjCqR0tuvSDHY10N67r36KeM71dD+ScSgzs34f3bB3gdbRgu10vUvBB9ovvU1TobfTQxcyudjYKvTqW3fa49eqe9v0vzrMp9v+renFRL1S2+Z1gnr+EYlFKc06p+5feOTbPczEpDutQMK+2078cj799ePTeOO9f2bUNGquPaiKYXkhxR9BEgIJdLt7KeNY43d0nXHn3LBnX446huTBnfz72Mo5DZ3Llu53U55PKeLWvsD8aztElW1UKRTc+MCOn4UGhWL4P8J4czsENj/nqNd3daQYgETevV9LaLJKLoI8AVvVoBMCbXf+qxNo7EH/3be09IfOnZnoOvVTcR3TWkI20a1XXbZnW0OmZSl/lqCwKZaF77pLlApoHEAHK6oU6+uY/fsv99kblFZqlWC1PvOp++OZFPBi0IrjSqG10vN1H0EaB9k0x2Pj+aTibc9jo3r8eCh4by24tq+to7uf3C9uQ9/qsa282MHK4+rzXZmWlc08f7al8nTj3/n99dWGPfxd2ac8eF7tm1srPsvvtTxvcF7C6ayx65xE945+BWmE2/dxCf//YCU0q5jgSRE+Icb3N1kUIUfRzQLjvTLSt89Z66UspjqkMzWWrOalyXVY/9irbZdf2WrTpfzW2pVsWjLqEfnvt1D168xh6H25lKsXn9dFo0CO+Q9JUb7G6gzepn0Kddoxr7zfbeg+WPo2pkxIwIF3QM3yK+eOfz354faxFiSrN66VFfBCiKPoEJd5IaX26Gro1Kh6aZ3DigLQ3q1ozN74/Gme7H9K/WQ3/tpvP48I6qidQrHWYwb9w8oJ3fc4bKjPsuZNb9gyu/P3BpZ+4Z5n0EFgzV3V6TmT7tGruF7KhtRDuNIIiiT2gi9cB4UtjOc733X/2Zdpd7j8wZsbNRpneTTb30FL59YEiNZOSfTHCva1SPlgzyE9vHlUaZaX5zCwD85eoePvf3y6k5WnByTqsGnN2yyiOpV5uGPDTcf0/fW7gJT4TLlf+sxuFP9j71Ls8ryUMh96z49diKNNHOLgWi6OMKfy+7RUG6y8KsaD4vzgVhQ7o0dQu+BnZXzGevOpdXfawszkiz0jUAxWeGb+690FT2rpYNMrihf1ufZT6dcEG4xKqkuYc4Rt7wduuvPq81V/RqxZ2D3edH1j813HM9QTQY913S2ef+gR1qj1kpGkQ7XyzIgqm4xNtzsOFpuztit8dm+ywXLE4lUb1eT7bx6tw80LcJxTnZHM6H3ONqZNy9lFY9emncZ/h6dPTZLN9xxOO+7Mw0/jS6O78Ul/Dmoqo8wJleGrhuLeq55Ss2w1mNwj8KELwTAz0vPfpEIiPV6qa0wt0zuDLXbg9vVi/8yVBGe/DDjwQ7nx/Nua0bVH7Pzkr3qhQjjdnbc8dg/xPK1VcuB1sG4Lq+0fX4SGTMXlNX/JkSRdHXcmK9QPPuoR3Z+PSISrfJcNDEUZfz2Q7HM+6MNln9hUn30sMPF84RhNl4/+GQxznKSjFp2B3Q3t3MUt1V1rly2hOX92zJRR5WQNdmqpvC7ru4U8h1ymSsAETX9u52XqWo48H7I7SgX7qybvt/+9ZwK5QNTw8n73FzC7WCZZAfF8jx1eIIPffrHvzWQy4CV979r/4+9zvnNVKsFjY87dku70RruGNwexb9YVjlNtfRjT/SU6w1QjgnApEMM1392W/VMHQzlyh6wRSz7h+cMC+kc0Fu9Q7pTQN8T44GSt20FI+NVDS4rHtzHnNZY+AkOyudh0d4985p3yTTb4PnurCmbpq7CcpTQhulFGc1Nr9moubxQR9ayfBzPK/k9sa6p4ZX5nIIhlAUZ3cXbypPVO/iVD/V0kcurjFRDvDISO/3PW5NN0qpEUqpzUqpbUqpiV7KDFVK5Sml1iulFoRXzNrBc7/uQdvGdf0mATm7ZX1Tdt14wBkl0tmjd4Z6CEUZRdrE9d9DOtDLh/tf9QHOG7f05fYLa77s/jDzwvuah7m8p+81Bk5GnNOi8nM0IjL/6zd9AyqflZ7CS9fnBn2+UBTntP8OzHW0uutxywZ1SLHWVKMXdfXegA/pHH3zmF9Fr5SyApOAkUB34AalVPdqZRoCrwFXaq3PAa6NgKxJz4hzW7DwD8M8PjiJxoOXduGJK7rz9vh+XH1eaxo6Gq87B3dg4UPD3PzSA8U5nA53x+jSs5vRskEGj4w6m/4+/Or9yVWd7x8cwjf31gwrEYshfDe/1z1WhkN7RycYAm28/jTKPhpuWi+dej7DdeChS1/10de8SbcW3q/zBB/hTiKFGY3SH9imtd6utS4DpgJjqpW5EfhCa70bQGtdFF4xhVgSjHfP/Zd25rZB7endthF/vy63MsSDUsprOIZ5vx8aoFwBi+WTt27tx9JHLglvpdjjGbVsWNOn3nWy9vp+9lhEiydeHPR5vDU0zus0/oIc/jq2Zw3F6E1PfjrhfB641O5j7/Q+CXRFcM825ucIbqxmznPNgxxOxji8y8w0ENf1c48R5frIaQ/bzGCJQT/OzClbA3tcvhc6trnSBWiklJqvlFqllLrFU0VKqbuUUiuVUisPHjwYnMRC0tK+Sc0UiJ6IpneSqzKo3uD9dWxPZj8wmGBxjcR5ydnN2fn86BorhwPhcj/hIvrlNA5oHqNfTmMeuLQLAM0dYXWv6NUqoPzCn/lYiHZ2y/pe7/kt57fj2weG+Kw7kJXHbpjQzPcM68iiPwyr7P1XHhqG3oWZUCHhxoyDsSepqr9rKUAf4BKgDrBUKbVMa73F7SCt3wDeAOjbt2+svQkFP7R0KJ2LuzWL6HneuqUvR08Hk80qsBemW4t6bHIkSQ8Fp/Kv3tvz9UBXl7Rt47ohzVMAZDti8981pAN3D+3odZXwnUM6MGfjAQZ0sM+P+NJV4R4luS5qe/7qHuwvLqn87ho/qDpPjznXZ7292jTguat7MPqVHwOWqUrRer9jnZplebw/ysPnQK9ZLEIgmFH0hYDrE90G2OehzCGt9SnglFJqIdAL2IKQsLRuWIdVj15KIw+RM8PJpd0D89IItks//d4LsZmIy+8Nf++na+//rVu8T0hu/fPIsPTpmtfPYMnEi2leP6Myw5gnzmvbiK1/HmWqTjNytW1cl/y9xSalrGKcnzAUgdCwbprP3+wLp2L29iikWhWje3geHYWjIYxFCAQzppsVQGelVHulVBowDpherczXwGClVIpSqi4wANgYXlGFWJCdle4WQjmRSUuxhOSC6a+JcLpKTr93kNfGq3FmGqlWi6kJ974mQk+0algnaIXnCW9KyHWR2Nu39fNYJlqMvyCHF6/t5dPG7mt1amV/3ksFT48512t4jWB19MMjulXmSYjLoGZa6wrgXuBb7Mr7E631eqXUBKXUBEeZjcBsYC2wHHhLa70ucmILQvxxaffmbHpmBD3bhCcy42e/DT7Q2hu/6cPrN3kPMgf2iJ1z/qfKDu5LiVXGQULRJCudNU9EdnGaL/73si41AusFgrMxc6r5J67oTo7JfA2jenhKqVl14f4womvl56/uGeQWbsLZWMarjR6t9UxgZrVtk6t9fwF4IXyiCYJnKr0dIvi+OGMKpbr0vC/s1IQfNhXRzodS8BZALd2x3UyAOF/USbVyvokkJZe5+M5745o+bejUrB4/7z5Wuc3fJXVec38Tst8/OCSsIw13Gez1OsNrXNq9GZsPmJ97qS7VbYPac9ug9kz8fC1TV+zxeAzYJ9/TU6ru77/H1xzZ3D20KkRC7lkNmZW/v/J7ZWMZA68biV4pJCyR7BfdPbQThtbcNLDKrnzboBwu79mSZgGEH3aSlZ7CzPsGm/Ys8sbGIBKq+8MZxK6tj8nh7Kw0tha5N3y+6Nw8vCGpZ90/mJEvLwKq7nvTeumVc0iT5jMwFT4AAAecSURBVBWYrsvZWFW33Djva0MvjVj1GEdOU12gHY5YGEITf2WOUOsILfaOOeqkWXloeDe3HpxSKigl76R7q/oxC9PgijOxi3NRz9CuzXjntn4eQyo4mXTjefzl6h4hN1TBcnbL+h6zcDnnkPrlNPK5Otl1vsPpnTSxWpiC313ciZfH5TLiXPfR0C3n20Nwe0rn6Q/nWolUq6psJmKxUE569ELC0alZPXYePl0j9kuy8D+/6sLU5bsjVv+Y3NYM6dyURplVimtoV7sLrTcdlJ2V7jd5SyxxJo5ZWnDYo/3e9XelWC0eJ2tTrRbG5NaMufPY5d3pl9OYywL1DgMmDO1IuaG5eWA7/vrt5hqyRIvkfFOEpOYf43LJ230s7InI44X7LunsN+tTqLgqeVecE4Vt4iQZyapHL6Xc5j6C8zWem+nFNz+UCdBUq4UrfCxGc9Y89ryacf7rpqVUBbarDPAnPXpB8EtWegoXdjafV1YwTyx6m75wzY0QkmiR/F2OixaJfL3hQmz0giDUwOw0yAUmPIACoXfbhl5DFo90uDamWgPX2tFov/xds0r3SjHdCIKQKDjt3DkTZ4Stzi/vHuR131+u7sHEke4T5GaJp5FK3PrRC4IgBMuiPwwLSxz8VKul0nc+UGKhXKtzbusGrN59LG5j3QiCUEuIRM831OBtwfKXq3tw7HQ5/zd7U0R79P5DpNl5Z3x/th08EZN8E2KjFwShBoGsVfjH9bmVvubxxA3929LDkTM3koq+kyNnbcemvtcYNKibSp92jSMniA+kRy8IQiXV48CY4arerRmT24r3lu6KjFAh0K2lfYXurefnsHjb4Yic4/KeLWnbuG5ASVaijSh6QRAqsToUfaaX2PaJRpOsdJ+RLMOBUspnjuF4IDnupiAIYaFFgwz+OKqbxyiNZohnhffRnQMorTBiLUZMEEUvCIIbdw0JPHm1Uoqv7hkUs1g4ZrigY+1dZCeKXhCEsJAbx735cDL1roGU2xJrZCCKXhAEIQAGdgjvauBoIIpeiEs+uH0Ah0+VxloMQUgKRNELcYkELROE8CELpgRBEJIcUfSCIAhJjih6QRCEJEcUvSAIQpIjil4QBCHJEUUvCIKQ5IiiFwRBSHJE0QuCICQ5KpAEA2E9sVIHgWADWDcBDoVRnGggMkeHRJM50eQFkTlaeJO5nda6aSAVxUzRh4JSaqXWum+s5QgEkTk6JJrMiSYviMzRIpwyi+lGEAQhyRFFLwiCkOQkqqJ/I9YCBIHIHB0STeZEkxdE5mgRNpkT0kYvCIIgmCdRe/SCIAiCSRJO0SulRiilNiultimlJsZaHidKqZ1KqXylVJ5SaqVjW2Ol1PdKqa2O/41cyj/i+A2blVLDoyTjFKVUkVJqncu2gGVUSvVx/NZtSqlXlFIqyjI/qZTa67jWeUqpUfEis1LqLKXUPKXURqXUeqXU/Y7tcXudfcgcz9c5Qym1XCm1xiHzU47t8Xydvckc+eustU6YP8AKFAAdgDRgDdA91nI5ZNsJNKm27a/ARMfnicD/OT53d8ieDrR3/CZrFGQcApwHrAtFRmA5cD6ggFnAyCjL/CTwew9lYy4z0BI4z/G5HrDFIVfcXmcfMsfzdVZAluNzKvATMDDOr7M3mSN+nROtR98f2Ka13q61LgOmAmNiLJMvxgDvOj6/C1zlsn2q1rpUa70D2Ib9t0UUrfVC4EgoMiqlWgL1tdZLtf2Je8/lmGjJ7I2Yy6y13q+1/tnx+QSwEWhNHF9nHzJ7Ix5k1lrrk46vqY4/TXxfZ28yeyNsMieaom8N7HH5XojvBzKaaOA7pdQqpdRdjm3Ntdb7wf4yAc0c2+PpdwQqY2vH5+rbo829Sqm1DtOOc3geVzIrpXKA3th7bglxnavJDHF8nZVSVqVUHlAEfK+1jvvr7EVmiPB1TjRF78kOFS9uQ4O01ucBI4F7lFJDfJSN59/hxJuM8SD760BHIBfYD/zNsT1uZFZKZQGfAw9orY/7KuphW7zIHNfXWWtt01rnAm2w93TP9VE8nmWO+HVONEVfCJzl8r0NsC9Gsrihtd7n+F8EfIndFHPAMczC8b/IUTyefkegMhY6PlffHjW01gccL4wBvEmV2SsuZFZKpWJXmB9qrb9wbI7r6+xJ5ni/zk601seA+cAI4vw6O3GVORrXOdEU/Qqgs1KqvVIqDRgHTI+xTCilMpVS9ZyfgcuAddhlu9VR7Fbga8fn6cA4pVS6Uqo90Bn75EosCEhGx3D4hFJqoGOm/xaXY6KC80V28Gvs1zouZHbU/29go9b67y674vY6e5M5zq9zU6VUQ8fnOsClwCbi+zp7lDkq1zkSs8uR/ANGYfcKKAD+FGt5HDJ1wD47vgZY75QLyAbmAlsd/xu7HPMnx2/YTAS9VqrJ+TH2oWE59l7B7cHICPR1PIwFwKs4Ft5FUeb3gXxgreNlaBkvMgMXYh9GrwXyHH+j4vk6+5A5nq9zT2C1Q7Z1wOOO7fF8nb3JHPHrLCtjBUEQkpxEM90IgiAIASKKXhAEIckRRS8IgpDkiKIXBEFIckTRC4IgJDmi6AVBEJIcUfSCIAhJjih6QRCEJOf/AcBPQv4xpI97AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.array_tool import *\n",
    "from utils.vis_tool import *\n",
    "import torch\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "print('Running on device:', device)\n",
    "\n",
    "model = TextRNN_Att(embed_dim=200, hidden_size=256, num_layers=1, class_num=4, dropout=0.0).to(device)\n",
    "init_network(model, method='kaiming')\n",
    "print(model)\n",
    "\n",
    "# training\n",
    "lr = 5e-5\n",
    "epochs = 20\n",
    "batch_size = 64\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "\n",
    "train_iter = Data.DataLoader(train_data, batch_size=batch_size, shuffle=True,collate_fn=PadCollate(dim=0))\n",
    "val_iter = Data.DataLoader(val_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "test_iter = Data.DataLoader(test_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=lr)\n",
    "# scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.75) # adjust learning rate\n",
    "# scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[3, 6, 8], gamma=0.1)\n",
    "# optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)\n",
    "\n",
    "# train 前先 eval 一下\n",
    "validation(model, val_iter, val_losses)\n",
    "\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "    # train each epoch\n",
    "    # scheduler.step() # 学习率衰减\n",
    "    for data, label in train_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.to(device)\n",
    "        logit = model(data)\n",
    "        loss = F.nll_loss(logit,label)\n",
    "        train_losses.append(loss.item())\n",
    "        \n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "    # val each epoch\n",
    "    validation(model, val_iter, val_losses)\n",
    "    print('epoch: %s\\t\\t test loss: %s' % (epoch, val_losses[-1]))\n",
    "    \n",
    "# visualization\n",
    "vis_loss(train_losses, val_losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:09:28.684802Z",
     "start_time": "2020-12-23T09:09:26.771894Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.6779411764705883\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.855914  0.880531  0.868048\n",
      "1   0.502632  0.553623  0.526897\n",
      "2   0.651982  0.643478  0.647702\n",
      "3   0.606557  0.359223  0.451220\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in val_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-23T09:09:35.667011Z",
     "start_time": "2020-12-23T09:09:34.249998Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.697268588770865\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.898851  0.892694  0.895762\n",
      "1   0.551247  0.534946  0.542974\n",
      "2   0.645740  0.665127  0.655290\n",
      "3   0.539474  0.546667  0.543046\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in test_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Transformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:15:19.879953Z",
     "start_time": "2020-12-22T02:14:57.572359Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "import utils\n",
    "# from model.TextCNN import *\n",
    "\n",
    "# loading our w2v\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:16:48.152255Z",
     "start_time": "2020-12-22T02:15:29.600242Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache /tmp/jieba.cache\n",
      "Loading model cost 1.183 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    }
   ],
   "source": [
    "from Dataset.Dataset import *\n",
    "from utils.doc_tool import *\n",
    "row_train = np.load('Dataset/data/train.npy')\n",
    "row_val = np.load('Dataset/data/val.npy')\n",
    "row_test = np.load('Dataset/data/test.npy')\n",
    "train_data = TextDataset(dataset2mat(row_train, w2v, pad_size=200))\n",
    "val_data = TextDataset(dataset2mat(row_val, w2v, pad_size=200))\n",
    "test_data = TextDataset(dataset2mat(row_test, w2v, pad_size=200))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:17:15.450799Z",
     "start_time": "2020-12-22T02:17:15.340799Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "\n",
    "class Transformer(nn.Module):\n",
    "    def __init__(self, class_num=4, embed_dim=200, head_num=5, hidden=256, N=2, pad_size=200, dropout=0.0,\n",
    "                 device=torch.cuda.device('cuda:3' if torch.cuda.is_available() else 'cpu')):\n",
    "        \"\"\"\n",
    "        Transformer. According to the paper Attention Is All You Need\n",
    "\n",
    "        Args:\n",
    "        - embed_dim: the dim of word embedding.\n",
    "        - head_num: the number of head.\n",
    "        - pad_size: length of each sentence.\n",
    "        - N: the number of encoders.\n",
    "        - hidden: the dim of hidden layer in FFN.\n",
    "        - class_num: the number of class of predicition.\n",
    "\n",
    "        \"\"\"\n",
    "        super(Transformer, self).__init__()\n",
    "        self.position_encoder = Positional_Encoding(\n",
    "            embed_dim, pad_size, dropout=dropout, device=device)\n",
    "        self.encoders = nn.ModuleList()\n",
    "        self.encoders.extend(\n",
    "            [Encoder(embed_dim, head_num, hidden, dropout=dropout) for i in range(N)])\n",
    "        self.fc = nn.Linear(pad_size * embed_dim, class_num)\n",
    "\n",
    "        self.device = device\n",
    "\n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "        - x: (batch, seq_len, embed_dim) a batch of data.\n",
    "\n",
    "        Returns:\n",
    "        - out: (batch, N) the corresponding scores.\n",
    "        \"\"\"\n",
    "        out = self.position_encoder(x)\n",
    "        for encoder in self.encoders:\n",
    "            out = encoder(out)\n",
    "        out = out.view(out.size(0), -1)\n",
    "        out = self.fc(out)\n",
    "        logit = F.log_softmax(out, dim=1)\n",
    "        return logit\n",
    "\n",
    "    def loss(self, y, labels):\n",
    "        loss = F.nll_loss(y, labels)\n",
    "        return loss\n",
    "\n",
    "\n",
    "class Encoder(nn.Module):\n",
    "    def __init__(self, embed_dim, head_num, hidden, dropout=0.0):\n",
    "        super(Encoder, self).__init__()\n",
    "        self.attention = Multi_Head_Attension(\n",
    "            embed_dim, head_num, dropout=dropout)\n",
    "        self.FFN = Positionwise_Feed_Forward(\n",
    "            embed_dim, hidden, dropout=dropout)\n",
    "#         self.LN1 = nn.LayerNorm(embed_dim)\n",
    "#         self.LN2 = nn.LayerNorm(embed_dim)\n",
    "        self.LN1 = nn.BatchNorm1d(embed_dim)\n",
    "        self.LN2 = nn.BatchNorm1d(embed_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = self.LN1(x + self.attention(x))\n",
    "        out = self.LN2(out + self.FFN(out))\n",
    "        \n",
    "#         out = x + self.attention(x)\n",
    "#         out = out + self.FFN(out)\n",
    "        \n",
    "        return out\n",
    "\n",
    "\n",
    "class Positional_Encoding(nn.Module):\n",
    "    def __init__(self, embed_dim, pad_size, dropout=0.0,\n",
    "                 device=torch.cuda.device('cuda' if torch.cuda.is_available() else 'cpu')):\n",
    "        super(Positional_Encoding, self).__init__()\n",
    "        self.device = device\n",
    "        self.dropout = nn.Dropout(dropout)\n",
    "        # dim of self.pe is (pad_size, embed_dim)\n",
    "        self.pe = torch.tensor([[pos / (10000.0 ** (i // 2 * 2.0 / embed_dim))\n",
    "                                 for i in range(embed_dim)] for pos in range(pad_size)])\n",
    "        self.pe[:, 0::2] = torch.sin(self.pe[:, 0::2])\n",
    "        self.pe[:, 1::2] = torch.cos(self.pe[:, 1::2])\n",
    "        self.pe = nn.Parameter(self.pe, requires_grad=False).to(self.device)\n",
    "\n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "        - x: (batch, pad_size, embed_dim) the sequence after embedding.\n",
    "\n",
    "        Returns:\n",
    "        - out: (batch, pad_size, embed_dim) the sequence after positional encoding.\n",
    "        \"\"\"\n",
    "        out = x + self.pe\n",
    "        out = self.dropout(out)\n",
    "        return out\n",
    "\n",
    "\n",
    "class Scaled_Dot_Product_Attention(nn.Module):\n",
    "    def __init__(self, embed_dim):\n",
    "        super(Scaled_Dot_Product_Attention, self).__init__()\n",
    "        self.embed_dim = embed_dim\n",
    "\n",
    "    def forward(self, Q, K, V):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "        - Q: (batch_size, len_Q, dim_Q) the query.\n",
    "        - K: (batch_size, len_K, dim_K) the key.\n",
    "        - V: (batch_size, len_V, dim_V) the value.\n",
    "        \"\"\"\n",
    "        attention = torch.matmul(Q, K.permute(0, 2, 1)) * (self.embed_dim ** 0.5)\n",
    "        attention = F.softmax(attention, dim=-1)\n",
    "        out = torch.matmul(attention, V)\n",
    "        return out\n",
    "\n",
    "\n",
    "class Multi_Head_Attension(nn.Module):\n",
    "    def __init__(self, embed_dim, head_num, dropout=0.0):\n",
    "        super(Multi_Head_Attension, self).__init__()\n",
    "        self.head_num = head_num\n",
    "        assert embed_dim % head_num == 0\n",
    "        self.dim_head = embed_dim // head_num\n",
    "        self.fc_Q = nn.Linear(embed_dim, head_num * self.dim_head)\n",
    "        self.fc_K = nn.Linear(embed_dim, head_num * self.dim_head)\n",
    "        self.fc_V = nn.Linear(embed_dim, head_num * self.dim_head)\n",
    "        self.fc = nn.Linear(head_num * self.dim_head, embed_dim)\n",
    "        self.attention = Scaled_Dot_Product_Attention(embed_dim)\n",
    "        self.dropout = nn.Dropout(dropout)\n",
    "\n",
    "    def forward(self, x):\n",
    "        batch_size = x.shape[0]\n",
    "        Q = self.fc_Q(x)\n",
    "        K = self.fc_K(x)\n",
    "        V = self.fc_V(x)\n",
    "        attention = self.attention(Q, K, V)\n",
    "\n",
    "        attention = attention.view(\n",
    "            batch_size, -1, self.dim_head * self.head_num)\n",
    "        out = self.fc(attention)\n",
    "        out = self.dropout(out)\n",
    "        return out\n",
    "\n",
    "\n",
    "class Positionwise_Feed_Forward(nn.Module):\n",
    "    def __init__(self, embed_dim, hidden, dropout=0.0):\n",
    "        super(Positionwise_Feed_Forward, self).__init__()\n",
    "        self.Linear1 = nn.Linear(embed_dim, hidden)\n",
    "        self.Linear2 = nn.Linear(hidden, embed_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = self.Linear1(x)\n",
    "        out = F.relu(out)\n",
    "        out = self.Linear2(out)\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:17:16.307895Z",
     "start_time": "2020-12-22T02:17:16.294953Z"
    }
   },
   "outputs": [],
   "source": [
    "def validation(model, val_iter, val_losses):\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        ls = []\n",
    "        for data, label in val_iter:\n",
    "            data = data.to(device)\n",
    "            label = label.long().to(device)\n",
    "            logit = model(data)\n",
    "            ls.append(F.nll_loss(logit, label).item())\n",
    "        mean_loss = np.array(ls).mean()\n",
    "        val_losses.append(mean_loss)\n",
    "    model.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:17:17.046465Z",
     "start_time": "2020-12-22T02:17:17.040437Z"
    }
   },
   "outputs": [],
   "source": [
    "def init_network(model, method='kaiming'):\n",
    "    \"\"\"\n",
    "    Initialize our pytorch model.\n",
    "\n",
    "    Args:\n",
    "    - model: our pytorch model.\n",
    "    - method: weight initialize method.\n",
    "    \"\"\"\n",
    "    assert method in [\n",
    "        'kaiming', 'xavier'], 'Your initialization should be xavier or kaiming'\n",
    "    for name, w in model.named_parameters():\n",
    "        if 'weight' in name and 'LN' not in name:\n",
    "            if method == 'kaiming':\n",
    "                nn.init.kaiming_normal_(w)\n",
    "            elif method == 'xavier':\n",
    "                nn.init.xavier_normal_(w)\n",
    "            else:\n",
    "                nn.init.normal_(w)\n",
    "        elif 'bias' in name and 'LN' not in name:\n",
    "            nn.init.constant_(w, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:20:56.331838Z",
     "start_time": "2020-12-22T02:17:19.456342Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0\t\t test loss: 0.9384592473506927\n",
      "epoch: 1\t\t test loss: 0.877009928226471\n",
      "epoch: 2\t\t test loss: 0.9775964518388113\n",
      "epoch: 3\t\t test loss: 0.8405214746793112\n",
      "epoch: 4\t\t test loss: 0.8294462263584137\n",
      "epoch: 5\t\t test loss: 0.8075477580229441\n",
      "epoch: 6\t\t test loss: 0.814605712890625\n",
      "epoch: 7\t\t test loss: 0.8027524352073669\n",
      "epoch: 8\t\t test loss: 0.774397095044454\n",
      "epoch: 9\t\t test loss: 0.7815552651882172\n",
      "epoch: 10\t\t test loss: 0.773815244436264\n",
      "epoch: 11\t\t test loss: 0.9018081029256185\n",
      "epoch: 12\t\t test loss: 0.7608503301938375\n",
      "epoch: 13\t\t test loss: 0.8648291329542795\n",
      "epoch: 14\t\t test loss: 0.7800744573275248\n",
      "epoch: 15\t\t test loss: 0.7865727742513021\n",
      "epoch: 16\t\t test loss: 0.9298795163631439\n",
      "epoch: 17\t\t test loss: 0.762397696574529\n",
      "epoch: 18\t\t test loss: 0.7974213361740112\n",
      "epoch: 19\t\t test loss: 0.7877491315205892\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.array_tool import *\n",
    "from utils.vis_tool import *\n",
    "import torch\n",
    "device = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')\n",
    "\n",
    "model = Transformer(class_num=4, embed_dim=200, head_num=2, hidden=256,\n",
    "                    N=2, pad_size=200, dropout=0.0, device=device).to(device)\n",
    "# init_network(model, method='xavier')\n",
    "# print(model)\n",
    "\n",
    "# training\n",
    "lr = 1e-4\n",
    "epochs = 20\n",
    "batch_size = 256\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "\n",
    "train_iter = Data.DataLoader(\n",
    "    train_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "val_iter = Data.DataLoader(\n",
    "    val_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=5e-4)\n",
    "# optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)\n",
    "# scheduler = torch.optim.lr_scheduler.ExponentialLR(\n",
    "#     optimizer, gamma=0.75)  # adjust learning rate\n",
    "# scheduler1 = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)\n",
    "# scheduler = torch.optim.lr_scheduler.MultiStepLR(\n",
    "#     optimizer, milestones=[15, 20, 25], gamma=0.5)\n",
    "scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min')\n",
    "\n",
    "\n",
    "# train 前先 eval 一下\n",
    "validation(model, val_iter, val_losses)\n",
    "\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "#     scheduler1.step()\n",
    "    # train each epoch\n",
    "    for data, label in train_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.to(device)\n",
    "        logit = model(data)\n",
    "        loss = F.nll_loss(logit, label)\n",
    "        train_losses.append(loss.item())\n",
    "\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "            \n",
    "    # val each epoch\n",
    "    validation(model, val_iter, val_losses)\n",
    "    print('epoch: %s\\t\\t test loss: %s' % (epoch, val_losses[-1]))\n",
    "    scheduler.step(val_losses[-1])  # 学习率衰减\n",
    "\n",
    "# visualization\n",
    "vis_loss(train_losses, val_losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:22:56.793563Z",
     "start_time": "2020-12-22T02:22:55.341590Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.6963235294117647\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.863636  0.882743  0.873085\n",
      "1   0.618026  0.417391  0.498270\n",
      "2   0.611765  0.791304  0.690047\n",
      "3   0.571429  0.388350  0.462428\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in val_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T02:23:35.281657Z",
     "start_time": "2020-12-22T02:23:34.033824Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7109256449165402\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEXCAYAAABf36TeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7KElEQVR4nO3deVhU5dvA8e/ADJuKK5AJkbnlvmClZqKZgCIJaoWZa24lUlZuiFruueTPLbXeNERNTcUtxa3CDJc0c8stBRVFEFEQlWVmzvsHOUGYDOowzHh/vM51Mc+cOc99kLnnmfs85xyVoigKQgghLJqNuQMQQgjx6CSZCyGEFZBkLoQQVkCSuRBCWAFJ5kIIYQUkmQshhBWQZC4MdDodS5YsoXPnznTq1IkOHTowffp0srOzH2mb7733Hr6+vixbtqzIrz927BihoaEP3f/jduvWLXr27Pmfz3fq1In09PRijEiIXCqZZy7uGTNmDGlpaUyaNIkyZcpw584dPvnkE0qVKsX06dMfaptXrlzB19eXP/74A1tb28cccfFLSEggICCAw4cPmzsUIfKRkbkA4NKlS2zatInJkydTpkwZAJycnPjss89o164dkDsq/eSTT+jYsSMBAQFMmzYNrVYLQP369Zk7dy7BwcG8+uqrfPvtt2RkZNCvXz+0Wi2dO3fm4sWL1KpVi9TUVEO/9x7fvn2b0NBQOnXqRFBQEOHh4ej1evbv30/Hjh0fqv/7qV+/PjNnziQgIIA2bdqwZcsWQkND8fPzo2fPnty5cweANWvW8MYbbxAYGEibNm1YsWIFAKNGjSIzM5NOnTqh0+moV68eH3zwAb6+vhw7dsywP/PmzeOtt95Cp9Nx7do1WrZsyb59+x7/f5wQ9yhCKIoSHR2tdOnS5YHrDB8+XJkwYYKi1+uVrKwspW/fvsqiRYsURVGUmjVrKpGRkYqiKMqxY8eUevXqKZmZmcqlS5eURo0aGbZRs2ZN5fr16wUeR0VFKX379lUURVG0Wq0yevRoJT4+Xtm3b5/i7+//0P3/W82aNZWIiAhFURRl0aJFSuPGjZWrV68qOp1OCQoKUjZu3KhkZGQob775ppKamqooiqIcPnzYsA/325+oqKgC+6PVapXu3bsrixYtUnr16qUsWLCgsP8CIR6JjMwFADY2Nuj1+geus3v3bt555x1UKhV2dnYEBweze/duw/Nt27YFoG7dumRnZxtGucbw8vLir7/+okePHnz11Vf06tULT09Pk/Tv6+sLwDPPPEPNmjVxc3PDxsYGd3d30tLSKFWqFAsXLiQmJob//e9/LFy48IH70rRp0wJttra2TJ8+na+//hqVSsXAgQON/l0I8TAkmQsAGjRowPnz58nIyMjXnpSUxIABA8jMzCyQ7PV6vaHMAWBvbw+ASqUCQCnkcEzeA6seHh7s2LGDAQMGkJGRQZ8+fYiOji7Q3+PoX6PR3Pfne65evUpgYCCXL1/Gy8uLDz/88IH74eTkdN/2K1euYG9vz4ULF+SgqDA5SeYCADc3NwICAggLCzMk9IyMDD799FPKlSuHg4MDLVu2ZPny5SiKQnZ2NqtXr6ZFixZF6qdChQocO3YMgB07dhjaV6xYwahRo2jZsiXDhg2jZcuWnD17Nt9rH0f/xjh+/DgVKlTg/fff55VXXuGnn34CcmfmqNVqdDpdoR9U6enpDBs2jM8//5yOHTsyevToxx6nEHlJMhcG48aNo3r16gQHB9OpUyfeeOMNqlevzsSJEwEIDw8nNTWVgIAAAgICqFq1KoMGDSpSH+Hh4YwfP56goCD+/PNPXFxcAAgMDESn09GhQwc6d+5MRkZGgSmAj6N/Y7z88su4ubnh5+dHYGAgiYmJVKhQgQsXLuDi4kKdOnVo3749N27ceOB+tm7dmpdffpmQkBAuXrzI8uXLH3usQtwjUxOFEMIKyMhcCCGsgCRzIYSwApLMhRDCCkgyF0IIKyDJXAghrIDa3AEYw/GZbuYOoURIi//Y3CGUICpzB1Bi2NmUMXcIJUzNR3p1UfLN3YvfPVJfj5NFJHMhhCguKpVlFiwkmQshRB4qC60+SzIXQog8ZGQuhBBWQJK5EEJYAZXKMu+IJclcCCHykJG5EEJYAUnmQghhBWQ2ixBCWAEZmQshhBWQZC6EEFbARmazCCGE5ZORuRBCWAFJ5kIIYQUkmQshhFWQZC6EEBbPxsYy06JlRi2EECZiqpOGZs+ezbZt21CpVHTt2pU+ffowatQoDh06hKOjIwAhISG0a9eO2NhYpkyZQlZWFu3bt2fo0KGFbl+SuRBC5GGKmvmBAwfYt28fGzduRKvV0qFDB7y9vTl+/DjLli3D1dXVsG5mZiZhYWFERkZSuXJlBg4cSExMDN7e3g/swzKLQ0IIYSIqlcroxVgvvvgiS5cuRa1Wc/36dXQ6Hfb29ly5coUxY8YQEBDAnDlz0Ov1HD16FE9PTzw8PFCr1QQEBBAdHV1oHzIyF0KIPIoyMk9PTyc9Pb1Au7OzM87OzvnaNBoNc+bMYfHixfj5+aHT6WjWrBnjx4/HycmJgQMHsmbNGpycnHBxcTG8ztXVlaSkpEJjkZG5EELkocLG6CUiIoK2bdsWWCIiIu677dDQUPbu3UtiYiJ79+5l/vz5VKxYEUdHR3r06EFMTAyKohSMyYhvAVY7Mh/Uy4f+PdqhKArnLyQxeMTXXLue/xP0vd6+DOrlw93MbE7/dYUPwxdzI+32Q/dZqUIZ/m/W+zzjXgm9XiFk5NfsO3QWgOCglgwd2BFFUbh7N5uPP43g96PnH2kfi8OmjXv4dvEPqFTg4GDPqNE9qVvvOQDS02/Tu8cEJkwaYGizdoqiEB62iBo13OndtyNpNzOY8NliTp+6gKOjPZ06e9P9HV9zh2kWO3fuZfjwWfz++2pzh/JIijKbpVevXgQFBRVo//eo/Ny5c2RnZ1O7dm0cHR3x8fFhy5YtlCtXDl/f3L8XRVFQq9W4ubmRkpJieG1ycnK+mvp/xm101Bakcf2qfDigI22CxtK03XDOxV1l7Cdv5FunVfM6fPxeAB26TaJZ+1FE/3SY+Z/3f6R+/zexL78eOEWTtsPo+8F8li/4EEcHO2o8V5nJo9+mU8+pNGs/iqlzo1i5qPCj0+YWF3eFL6Z/x8KvhrMmagoDBgXyYej/ANgd8wdvvzmWuLgr5g2yGJ0/d5l+fSaxPXqfoW3a1EicnBxYv3k6y1eOZ8/uP4j56XczRmke8fFX+PzzJfcdVVqaoozMnZ2dcXd3L7D8O5knJCQQHh5OdnY22dnZ7Nq1ixdeeIHJkyeTlpZGTk4Oq1atol27djRs2JC4uDguXLiATqdj8+bNtGrVqtC4rTKZHz4WRz3voaTfuou9vYann6pA6o2MfOs0qV+VH/cc5/LVVAA2bP2NDm2boNHYotHYMm1sD2J/mMz+6Kl8NXMQZUo75nv9VzMH8U7Xf37BtrY2tG/bmCXf/QjA0T8v8FfcVXxaNyQrO4f3h3/N1eSbAPx+9DxuLuXQaEr2BX3s7DR8NqEfLq7lAahbryopKTfJydayYtk2Jk4ZhKtLeTNHWXy+W7GdwCBvfPyaGdr+PBFHQKeW2NraoLFT08q7Mdu3HzBjlMXv7t1Mhg2byciR75o7lMdDZWP8YiRvb2+8vb0JDAykS5cuNG7cmJCQEAYMGEC3bt3w9/endu3adOzYEXt7e6ZOncqQIUPo0KEDzz33HH5+foX2YbIyy7lz59i2bRtXr17FxsYGV1dXXnnlFerXr2+qLvPRanUE+DTly2kDyM7OYfzM7/M9/9sf53i/jx/PVKnExcsp9HzTG3t7DRXLl6FPt1fRanW08A8D4LPhbzFhZDc+DF/8n/1VqlAGG5WKlNRbhrbLialUqVyBDdG/cTHhn69Nn4/pwQ87D5GTo3vMe/14VaniQpUquQdiFEVh+ufLadOmCRo7NQu/HmHm6Irf6DF9ANi374ShrX6D6mzasIdGjWuSk61l544DqNUl+0P6cRs7dj5vveVHrVrPmjuUx8JUp/OHhoYSGhqar6179+507969wLrNmzdn48aNRdq+SZL58uXLWb16Nb6+vobkfe3aNcaMGcPrr79O3759TdFtAZu2H2TT9oP06fYqm5aNpO4rQw1fA389cIpJ/1vLyq8+Qq8oLF31M9dv3CI7W0uHto0p61yKV1/Jjd3OTs21lNx6++4NE7CzU+NRpRKtW9Ql5N327D14hmnz1t83Bp1Ob/jZydGer78YhHvlirzec6ppd/4xunMnk/CwRSQlXmfBE5jEH+STEd2ZOW05b3YOo5JLOZq3qM8fh8+YO6xis3z5D6jVtnTt2o6EhMJnXFiCokw5LElMksyXLl3K+vXrDWc13dOnTx+CgoJMnsyf83TjKddyxP52GoCIVT8xd/K7lC9bitSbueWW0qUc+GXfSSJW/QyAa6WyjP3kDVJvZmBja8Mnn0aw/ecjAJRyssfB3g6AVp3GALlllt17/2TZmt1AbpkFoFzZUtz8+yDq00+V53JibhnH4+mKrFk8jNN/Xcb3rQlkZuWY9HfwuCReSSHk/Zk899zTfBMRjoODnblDKlFuZ9zlo0/epmy50gB88/VGPJ55ysxRFZ+oqF1kZmbRqVMoOTlaMjOz6dQplK++GoebW0Vzh/dQLPW2cSaJWq1Wo9VqC7RnZmai0WhM0WU+ld3KsXTeECqWLwPkziQ5cfqSIZHnrlOe7avHGGrho0KD+H5DLAA7Y44yqJcvGo0tKpWKLz8fwPiRwQ/sU6fTE/3jYfp1bwtAveef4fka7uze9yfly5Zi++qxbIj+jZ4hcy0mkafdzKBPz4m81q4p078YIon8Plav2sm8ubklvJSUNNau+Qn/ji3MHFXxWbPmCzZvns+GDXP46qtxODjYsWHDHItN5AAqG1ujl5LEJCPzQYMGERgYSPPmzQ2T369du8a+ffuMusbAo/r1wGk+n7uebavHoNXqSEy6wZv9Z9KkwXN8+Xl/mrUfxdnzicz4ciO7N0zAxkZF7G+nGTpmCQBTZq9jSvg77Ns6FVsbFUf/vMDICcvy9THg44UF+v0gfAlfTuvPwR3TUBSFdz+cT/qtuwwPCcSjSiVe923K675NDet36DYp3wdMSbNq5U4SE1PYtfMgu3YeNLT/3+Iwyv39Qfmk6zegE6NGfElQwHAUReG9wV2oV7+aucMSj8IyB+aoFBPNJUpKSmLv3r0kJyejKApubm40b94cNze3Im/L8ZluJojQ8qTFf2zuEEoQy6xrmoKdjXyw5lfz0V7dfIHR657Z+94j9fU4mWw2i5ubG4GBgabavBBCmIYcABVCCCtgoWUWSeZCCJGHYiMjcyGEsHySzIUQwgpIzVwIIayAZeZySeZCCJGPlFmEEMIKSJlFCCGsgK0kcyGEsHyWmcslmQshRF6KlFmEEMIKyAFQIYSwApaZyyWZCyFEPlJmEUIIK2Chs1ks9PpgQghhIiqV8UsRzJ49mw4dOuDv78+SJbk3womNjSUgIAAfHx9mzZplWPfkyZN06dIFX19fRo8efd87t/2bJHMhhMjLBMn8wIED7Nu3j40bN7J27VoiIyM5deoUYWFhfPnll2zZsoXjx48TExMDwLBhwxgzZgzbtm1DURRWr15daB+SzIUQIi8b45f09HQSEhIKLOnp6fk2+eKLL7J06VLUajXXr19Hp9ORnp6Op6cnHh4eqNVqAgICiI6O5vLly2RmZtKoUSMAOnfuTHR0dKFhS81cCCHyKsKIOyIignnz5hVoDwkJYciQIfnaNBoNc+bMYfHixfj5+ZGcnGy4RzKAq6srSUlJBdpdXFxISkoqNBZJ5kIIkYdShAOgvXr1IigoqEC7s7PzfdcPDQ2lf//+DBo0iPj4+ALPq1Qq7ndbZpURHzCSzIUQIq8ijMydnZ3/M3Hnde7cObKzs6lduzaOjo74+PgQHR2Nra2tYZ3k5GRcXV1xc3MjJSXF0H7t2jVcXV0L7UNq5kIIkZeqCIuREhISCA8PJzs7m+zsbHbt2kVwcDBxcXFcuHABnU7H5s2badWqFVWqVMHe3p5Dhw4BsH79elq1alVoHzIyF0KIvExwOr+3tzdHjhwhMDAQW1tbfHx88Pf3p0KFCgwZMoSsrCy8vb3x8/MDYMaMGYSHh3P79m3q1KlDz549C+1DpdyvQFPC5Oj/MHcIJcK7v6SZO4QSY6JXeuErPSEqO3mYO4QSRWPT6JFeX63nKqPXPbf0rUfq63GSkbkQQuRlmSeASjIXQoh81JZ5KFGSuRBC5KHIyFwIIayAXM9cCCGsgFwCVwghrICMzIUQwgpY5vFPSeZCCJGPrWVmc0nmQgiRhyI1cyGEsAKWOTCXZC6EEPnIAVAhhLACUmYRQggrUISbU5QkksyFECIPRcosQghhBSSZCyGEFZCauRBCWAGZmiiEEFZARuZCCGEF5OYUQghh+Ux1Ov+8efPYunUrkHuD5+HDhzNq1CgOHTqEo6MjACEhIbRr147Y2FimTJlCVlYW7du3Z+jQoYVuX5K5EELkZYKBeWxsLHv27CEqKgqVSkW/fv3YsWMHx48fZ9myZbi6uhrWzczMJCwsjMjISCpXrszAgQOJiYnB29u7uMMWQggLplIZvxjJxcWFkSNHYmdnh0ajoVq1aly5coUrV64wZswYAgICmDNnDnq9nqNHj+Lp6YmHhwdqtZqAgACio6ML7UNG5v9BURTCwxZQvYYHffoGALByxTbWrvmRzKxs6tR9jgkTB2FnpzFzpMZRFIXz336LU5UqVPbxyffctb17ubpjh+Gx7u5dsm/coPG0aWicnR+qv5xbtzi3eDFZqamoVCqq9uhBmWrVAEjZt4/E7dsBsLGzwzM4mNLPPvtwO1aM4s4mMm96FLczMrGxseHD0V2pWdudpYu28fP2I9jaqqjxvDsfju6Knb1l/F08Cmt7jxgUYZ55eno66enpBdqdnZ1xzvPeqVGjhuHn+Ph4tmzZwooVKzhw4ADjx4/HycmJgQMHsmbNGpycnHBxcTGs7+rqSlJSUuFhGx31E+TcuQTe7TOBbdF7DW07tu9n+fJo/m/xGDZsmklWZjZLI34wY5TGu5uYyKkvviD14MH7Pu/SvDn1x46l/tix1A0LQ1O2LJ7duj10IgeIX7GCMjVq0PCzz6j27rucXbQIXVYWd69e5eKaNdQKDaX+2LFU8ffn7IIFD91Pccm8m83IwV/xZs82LFzxEe/0e42po5dz5OBf/LztDxYsH8pXqz7hzu0s1q/aY+5wTc7a3iP52KiMXiIiImjbtm2BJSIi4r6bPnv2LH379mXEiBE899xzzJ8/n4oVK+Lo6EiPHj2IiYlBUZQCr1MZ8S1ARub3sXLFdgKDWlO5ciVD26aNu+nVuyNly5UGYOyn/cnJ0ZopwqJJ+uknKrVogV2FCoWum7htG+oyZXD7uz6n12q5tHYt6WfOgKLg5OGBZ3Aw6r8P2ACcW7IE51q1cGnRAgBFp+Pm0aM8+/bbAJTy8MDB1ZW0Eyco9cwzVO3ZE7ty5XKf8/QkJz0dvVaLjbrk/jke2neGyu4VeallbQCae9flqSoVuHnjNtnZWrKycrCxVZGdnWN5I9GHYG3vkbyUIlybpVevXgQFBRVod77PQOjQoUOEhoYSFhaGv78/p0+fJj4+Hl9f39x+FQW1Wo2bmxspKSmG1yUnJ+erqf+XkvvuMaPRY/oCsH/fcUNbfHwi9eqnM7D/ZJKTb+Dl9TwffdLdXCEWyb2kmn7q1APXy7l1i8QdO6gXHm5ouxIdjcrWlnrh4ahUKi5FRXFp3Tqqdv/vfc/JyEBRFDRlyhja7MqXJ/vGDSo0aYJ9pdwEoCgKF77/nnING5boRA6QcPEaFSqVYeb41Zw7c4XSZRzpH+pPkxdr0OSlmnT3n4hGY4u7pyv+XZqZO1yTs7b3SD5FqIX/u5zyXxITExk8eDCzZs2iefPmQO7f/+TJk2nWrBlOTk6sWrWKoKAgGjZsSFxcHBcuXMDd3Z3NmzfTpUuXQvswyTvoypUrD3z+6aefNkW3JqXN0bE39ihz5w/D3s6OsFHzmfO/lYwM623u0B6b5F9+oXzDhjhU+me0dfPoUXR37pD2558A6HU6Q5I+PnkyilZLVmoq6adOcXXnTkpXr06VDh3u34HNP1U9XVYW55csIevGDZ7/4APT7dRjotXqOLDnFNMXDaJ2fU9ifz7O6A++oedAH65eSWXVtrGoNWpmfLqKRbM2ETK84GjN2lnNe8QE12b55ptvyMrKYurUqYa24OBgBgwYQLdu3dBqtfj4+NCxY0cApk6dypAhQ8jKysLb2xs/P79C+zBJMh84cCDx8fG4uroWqP+oVCp27dplim5NytW1PG1fe5HSpZ0A6BjwCgsXrDVzVI9X6sGDeL71Vr42Ra/H8623KFe/PgC6zEz0OTkA1AsLA+5fZgHQ3r6NulQpALJv3MCufHkAsq5f58z8+Tg89RR1Pv4YGzs70+/cI6ro4ozHs67Uru8JQIvW9fhiwvfE7DhC2w5NcCrlAIB/55eYNy3KnKGajdW8R0wwzTw8PJzwPN948+p+n2+5zZs3Z+PGjUXqwyQHQL/77juqVq3KtGnT+PHHH/MtlpjIAdr5vsT2bfvIzMxGURR+3PUb9epVM3dYj4329m0yk5MpXS3/PpWrW5ekn35Cr9Wi6PXERUZyKerByUpla0u5+vVJ3r0bgDsJCdxNTMS5Zk20t29zcsYMyjduTI0BAywikQO82OJ5khJTOXMyAYCjv59DpYKatd359cdj6LQ6FEVhz4/Heb6ep5mjNQ9reY/Y2Bi/lCRGj8wPHDhAWlpavpG2z7+muN1TunRpJk6cyPfff4+Xl9ejR1kCBHfzJS0tgze7jkSv01O7TlWGjehh7rAeWkZ8PHFLl1J/7FgAMq9dQ1O2bIHadRV/fy6sWcPxCRNQ9HqcPDx45o038q1TrU+fAtuv2r0755cu5einn+au07cvaicnLv/wA1mpqdw4fJgbhw8b1n/+o4/QlC79mPfy8alQyZlPZ/Zm7pS1ZGZmo9GoGTe9NzXruLPwi428+8Z0NBo11Wo+zZART16JBaznPVLSkrSxVMr95sH8y/Dhw9m3bx+env+MOFQqFUuXLjVpcPfk6P8oln5Kund/STN3CCXGRK+Cc3ufVJWdPMwdQomisWn0SK+vtmC30euee6/VI/X1OBk1Mj948CBbt26l1N/1TyGEsFYWetFE45L5008/LYlcCPFEsOpk3qRJE4YOHUqbNm1wcHAwtP9XzVwIISyVykJr5kYl88N/H6j6/vvvDW0qlUqSuRDC6lj1yDwyMhIArVabe2afxvpPVxZCPJlsLXRkblTY169fp1+/fjRq1IgGDRrQs2dPo67iJYQQlsYEV8AtFkYl8/Hjx9OoUSNiY2OJjY2ladOmfPr3/GEhhLAmKpXK6KUkMSqZx8fHExISgrOzM+XLlyc0NJSLFy+aOjYhhCh2Khvjl5LEqHC0Wi1ZWVmGx3fv3i1xn0pCCPE4WGqZxagDoB06dKB379507twZgHXr1hmuwSuEENbEUk/nNyqZDx48mKeeeopffvkFvV5P586d6dq1q6ljE0KIYmeCK+AWiwcm84yMDEqXLs3NmzcNt0O6Jy0tjXJ/3y1GCCGsRUkrnxjrgcm8R48eREVF0axZs3w1ckVRUKlUnDx50uQBCiFEcbLKZB7193Wr//zzT2z+VUi6efOmyYISQghzUVloncWoUv/97j/39t/3lRRCCGtilbNZevXqxbFjx8jMzKRJkyaGdp1OR506dUwenBBCFDernM0yf/58bt68SVhYGFOmTPnnRWo1Li4uJg9OCCGKm6mqLPPmzWPr1q0AeHt7M3z4cGJjY5kyZQpZWVm0b9+eoUOHAnDy5EnCw8PJyMigadOmfPbZZ6jVD558+MDPoNKlS+Pu7s6XX37J5s2bqVKlCgD/93//R2Zm5uPYPyGEKFFMUWaJjY1lz549REVFsX79ek6cOMHmzZsJCwvjyy+/ZMuWLRw/fpyYmBgAhg0bxpgxY9i2bRuKorB69epC+zDqC8WoUaMMBzydnZ1RqVSMGTPG+D0RQggLYYrT+V1cXBg5ciR2dnZoNBqqVatGfHw8np6eeHh4oFarCQgIIDo6msuXL5OZmUmjRo0A6Ny5M9HR0YX2YdRJQ/Hx8cydOxeAMmXKEBYWxuuvv278ngghhIUoyog7PT2d9PSC96N1dnbG2dnZ8LhGjRqGn+Pj49myZQs9evTIV652dXUlKSmJ5OTkfO0uLi5GXaXWqGSu1WoNJxAB3L59GyPuAy2EEBanKNedioiIYN68eQXaQ0JCGDJkSIH2s2fPMnDgQEaMGIFarSYuLq5A3/fLrcbEZFQyDwwM5I033sDPzw+VSsWOHTsM12kRQghrUpTZLL169SIoKKhAe95R+T2HDh0iNDSUsLAw/P39OXDgACkpKYbnk5OTcXV1xc3NLV/7tWvXcHV1LTQWo5L5wIEDqV69Onv37kWtVvPJJ5/g7e1tzEsfC63+TrH1VZJVctCZO4QS47U2cgnme07sdzd3CFalKGWWf5dT/ktiYiKDBw9m1qxZNG/eHICGDRsSFxfHhQsXcHd3Z/PmzXTp0oUqVapgb2/PoUOH8PLyYv369bRq1arQPoy+NouXlxdeXl6G527evCnXZhFCWB1TTE385ptvyMrKYurUqYa24OBgpk6dypAhQ8jKysLb2xs/Pz8AZsyYQXh4OLdv36ZOnTr07Nmz0D5UygOK30FBQURFRfH888+b9dosd7WxxdJPSTf6kEwHvWdziFwX6J4T+1uYO4QSRWPT+JFe3y76V6PX3eH38iP19TgZdW2WU6dOFUswQghhbjYqy5zc8cBkvn79+ge+ODAw8DGGIoQQ5qcuYddcMdYDk/m9ierXrl3j/PnzNGvWDLVazf79+6ldu7YkcyGE1bHKkfnChQsBGDBgALNmzeKZZ54B4MqVK3IGqBDCKlnoFXCNm5qYmJhoSOQATz/9NFevXjVZUEIIYS4WetFE45K5i4sLc+bMMUyOX7VqFR4eHiYNTAghzMFSR+ZGfQhNnTqV06dP06lTJ4KCgrh8+TKTJ082dWxCCFHsVCrF6KUkMWpk7urqyvz580lLS6Ns2bKmjkkIIczGUmezGDUyP3/+PP7+/nTs2JGkpCTat2/PuXPnTB2bEEIUOxuVYvRSkhiVzCdOnEhYWBgVK1bEzc2Nd955h7Fjx5o6NiGEKHY2KuOXksSoZH7z5k1efvmf01a7d+9ORkaGyYISQghzsSnCUpIYVTMHyMrKMlyf5dq1a+j1epMFJYQQ5lLSRtzGMiqZd+vWjXfffZfr168zc+ZMfvjhB/r162fq2IQQotiVtFq4sYxK5m+88QbPPvssP//8M1qtlvHjx9OyZUtTxyaEEMXOUmezGJXMe/XqRUREBC+88IKp4xFCCLOy1JG5UTX8W7duceeO3O1HCGH9LHU2i1Ejc0dHR9q0aUOtWrVwcnIytN+7EJcQQliLkpakjVVoMj9z5gxt27alZcuWPPXUU8URkxBCmE1Jm3JorAcm87Vr1/L555/j6enJxYsXmTFjBq+88kpxxSaEEMVObWOZNfMHJvPIyEg2bdqEm5sbhw8fZtasWZLMhRBWzSpH5gBubm4ANG7cmBs3bpg8oJLgh02xRCyOBhU4ONoxYlR3atR05/PJyzmw/yROTg54t27EoMGdsLEp+f/1iqJw9OullHZ/mmod2hV4Pv3SZU5ErkJ75y4qGxvq93mbslU9H7o/XVY2R7+JJO1CAih6nn8riKe8GgFw7eifnF6zAUWvB5WK598IxKVBnYfuq6jeeaM+3brWQ1EULiakEz7pJ1Jv3L3vuq95V2Xap6/RpM3Xj9Sng72aSeFtqFOrEiobFTPm7mVnTBwALZt5MPS9ZqjVNuj1CjPn72XPvkuP1F9xURSF8LAFVK/hQZ++Aeh0eiZNWMzBg7k3236lVSM+GfZOvpvBWwJT1swzMjIIDg5m4cKFuLu7M2rUKA4dOoSjoyMAISEhtGvXjtjYWKZMmUJWVhbt27dn6NChhW77gcn83/8Jtra2j7AbliE+LpFZM1bz3ZpPcXEpxy+7j/DxB/N4PagliVeus2b9RDQaWyZ8GsHq734kuPtr5g75gW5dTuTE0pXcOBdHTfenCzyvy8rmwLQ5NOjXA9eG9bh66AiHFy6h9eefPnSfZ6I2Y+vgQOvPx3E3JZVfx0+jbFVP1A4OHF6wmOajP6KM+9OkX0xg7+QvaDtrMmpHh0fYS+PUfd6Fvu804vW3V5FxO5sRH7Tgw0EvMXbKzwXW9fQoy4gPXkb1GN7ZQwa8wJ27ObR/8zsqu5Vm9ZKuHDuZzO3bOcyc4EP3gVH8dT6VWtUrsvyrILw7RnD7Ts4j92tK585dZtKExRw9cpbqNXLvbbBp427i4xOJ2jAdvV7PO2+PZfu2/fj6NTNztEVjqkvbHjlyhPDwcOLj4w1tx48fZ9myZbi6uhraMjMzCQsLIzIyksqVKzNw4EBiYmLw9vZ+4PaLNKwsyifszp07iYyM5OLFi/naV61aVZQui53GTsPY8X1wcSkHQN26VUlJSePE8Th827+Evb0GGxsb2rRtwo4dB80brBEu7IrBvVULnn7R677PXzv+J06uLrg2rAeAW5MGNBn8z9m9Zzdu5Zcxk/klfBIH/7eQzBs3873+zLrNnFm3OV/b1UN/8Ezr3Gv5OFaqgEu92iTuP4Si01GvVzBl/v5QKV2lMigK2cV0nZ8Tp67h03k5GbezsbOzxc2lFDfTMgus52CvZsb4dkz5354Czw3q40VU5JtsWP4WX05vj2slp3zPD+n/AkP65z8fo13r51i9/k8AEpMy+HX/RTq8Vh2N2obPpsXw1/lUAP6KS0WlgvLlTP/B9qhWrthGYJB3vkSt0+m5ezeT7OwccrK15ORosbfXmDHKh1OUqYnp6ekkJCQUWNLT0wtsd/Xq1YwbN86QuO/cuWO4BWdAQABz5sxBr9dz9OhRPD098fDwQK1WExAQYLgf84M8cGR++vRpmjRpYnicmZlJkyZNUBQFlUrF77//ft/XzZgxg+PHj1OtWjUWLFjAiBEj6NSpEwArV67krbfeKjQwc6lSpRJVqlQCcr9Gzpj2Ha3bNKZmLQ+2Rx+gnU9TNBo1W3/YR8q1NDNHW7h6PYMBuH7i1H2fv301Gftyzhz5v0huXUxA7eRI7eDOACTs2cetS5d5+dMR2NjacvGnXzj6zTJe/CTkgX1mpt7AoUJ5w2OHCuXITL2JXZnSPN2sqaH9zLpNlHrKDSeXSo+6m0bT6vS85l2VSeFtyM7WMXvR+gLrTAhrzcp1Jzh99nq+9sAOtahVvSJde3+PTqfwVlAdJoW/Sv8PNxfYRl6V3UqTmPTPB9bVpNs85VqaG2mZbNnxl6H9g4EvEX/xJglXbj3aThaD0WP6ArB/33FDW2BQa7Zv20/b1u+j1epo8XIDWre5/yCiJCvKCDciIoJ58+YVaA8JCWHIkCH52iZNmpTv8fXr12nWrBnjx4/HycmJgQMHsmbNGpycnHBxcTGs5+rqSlJSUqGxPDCZ79ixo9AN3E9MTAxRUVGo1Wp69OhB3759sbOzo3379iiKZRwpvnsnizGj/4+kq6nMX/Qxjg52zJ29hp7dJ+LsXAofvxc5e8YyapsPotfpSD5ynGajhlK+WlWuHjrCbzPn0+aLiST/cYyb5+P5ddxUABS9Hl12NgAHZy/k7rXrZKXljkCSfj+Co0tFmn4wCEVf8P84b7lCr9NxcsUako+eoNmID02/k/+yMyaOnTFxvBlYh8VzA3gtaBn3/izf7loPrU7P2k0nqVK5TL7XtW75LA3qurJu6ZsA2NiocHTIfQvNn9Ye9yrOVKqYO1J/rfVzJFxOZ/Dwrfct1ejy/I5sbVWM+rAlrVo8Q6/3N5hil4vFgvlrKF++DDG/LCIzK5vQkBl8u2Qzvft0NHdoRVKU2Sy9evUy3E4zL2dn50Jf6+Hhwfz58w2Pe/Towfr16/Hz8yuwrjFVkQcm8ypVqhS6gfu5N3IHePbZZ1m0aBF9+vShQoUKFnEwJPHKdT4YPJuq1Srz9ZIRODjYkXItjR69/fhoWO5Id9vW/Xg842bmSB+dQ7mylK78FOWrVQXgKa+GHFu8jDvJKSh6PdX8ffBsm1ur0+XkkHM790zgph8MAjCUWGp2/ucN61ixAlk303Eol3tXqswbaTg/4w5Azu3bHJr7NSgKL48djl2Z0sWzo8Az7mVxqejEoSOJAKzZeJLPRnpT1tmem2lZAHTu+DwODmo2LH8LjdoGB3tbNix/i/4fbMLWVsXXS3/nu7UnANBobCjrnFsSGTx8K4ChxDL3698M/SZezcClohMp13N/d26upTh5JgUA5zL2zP089837Zt81hjgs0c4dBwgL74PGTo3GTk2nwFZs37bf4pJ5UQ6TODs7G5W47+f06dPEx8fj6+sL5OZNtVqNm5sbKSkphvWSk5Pz1dT/i0mmYvj5+dGjRw+OHj0KQI0aNZg9ezYffvhhgRp6SZN2M4N3e0/l1XZN+HzGezg42AHw80+HmfhpBIqicOd2JpER2+ngb1kHdu7HpUFd7qZcJy3uAgDXT50FwMmlEi7163Ax5ldy7ubO9jizbjNHFn1b6DbdmjTg4s+/AHA39QbXjp7AtVF9dDk57J82FyeXirw4PLRYEzmAayUnZk3yoXzZ3AT8ul9Nzp5LzZdAu/ZeQ8fglXTqvor+H24mM0tHp+6rSE65w559F3mjUx1KlcqtA38w8CWmf1b4AfBdu+N4K6gukJvIX2n+DD/9Eo9GY8OSeQEkXE6n75CNFp3IAWrXqUr01r0A5ORo+enHQzRsWMPMURWdbRGWR6EoCpMnTyYtLY2cnBxWrVpFu3btaNiwIXFxcVy4cAGdTsfmzZtp1apVodsz+nrmRRESEoKXlxelSpUytHl5ebFu3ToWL15sii4fm9WrfuJq4nV+3Pk7P+7855jAgq8+5vix83TpFI5er6dzV2/a+Vrmhcdunr/AscXLeGXiaBzKlcXrg0Ecj1iJNisLG40ar9CB2Npp8PB+mcwbN4n9bBqoVDhWLE/D/r3ybSvviDxv2/FvvyNm1HgUvZ7ngztTys2Fy7EHSIu7gD4nx1C6AWg4sDfOHg/3LbAoDv6RyIIlB4lcFIhOp5B87TbvD9tCvdouTAp/lU7dH3xwfvX6P3FzKc33i7uiAIlXbzHys1351sk7Ir9nzqIDfDbSmx9WdcPWRsW0ObFcupxOgF9N6tdxw85ObSjdAAwbu4Mz51Ifyz4XpxEjezJ50hICOnyEjY0NLzWvR99+r5s7rCIrrgttPf/88wwYMIBu3bqh1Wrx8fGhY8fc99PUqVMZMmQIWVlZeHt737f08m8qxQKK2He1seYOoUQYfajgzIsn1eaQk+YOocQ4sb+FuUMoUTQ2jR/p9VOPGH+scGTDgudtmItJRuZCCGGprPZCW0II8STRlPyTuu9LkrkQQuRhqTenkGQuhBB5SJlFCCGsgKVegUqSuRBC5CEjcyGEsAIaa7w5hRBCPGlkZC6EEFZAkrkQQlgBSeZCCGEFbGWeuRBCWD4LPQFUkrkQQuSlttBsLslcCCHykDKLEEJYATkAKoQQVkCSuRBCWAFJ5kIIYQXkdH4hhLACFjqZxWLjFkIIk7BRGb8UVUZGBh07diQhIQGA2NhYAgIC8PHxYdasWYb1Tp48SZcuXfD19WX06NFotdrC4y56OEIIYb1sVcYvRXHkyBG6detGfHw8AJmZmYSFhfHll1+yZcsWjh8/TkxMDADDhg1jzJgxbNu2DUVRWL16daHbl2QuhBB52KgUo5eiWL16NePGjcPV1RWAo0eP4unpiYeHB2q1moCAAKKjo7l8+TKZmZk0atQIgM6dOxMdHV3o9i2iZu6grmjuEEqEz1+4Y+4QSoyZv71q7hBKjNs5ieYOoUR51BsyF6V8kp6eTnp6eoF2Z2dnnJ2d87VNmjQp3+Pk5GRcXFwMj11dXUlKSirQ7uLiQlJSUqGxWEQyF0KI4qIuQjKPiIhg3rx5BdpDQkIYMmTIA1+rKAVH9iqV6j/bCyPJXAgh8jAibxr06tWLoKCgAu3/HpXfj5ubGykpKYbHycnJuLq6Fmi/du2aoTTzIJLMhRAij6Ic17xfOcVYDRs2JC4ujgsXLuDu7s7mzZvp0qULVapUwd7enkOHDuHl5cX69etp1apVoduTZC6EEHkUZWT+KOzt7Zk6dSpDhgwhKysLb29v/Pz8AJgxYwbh4eHcvn2bOnXq0LNnz0K3p1LuV6ApYRROmzuEEkGrlwOg96htHMwdQokhB0DzK615tIPjv6f8YPS6TSr5P1Jfj5OMzIUQIg+VXAJXCCEsn1xoSwghrICF5nJJ5kIIkZeMzIUQwgpYaC6XZC6EEHkV19TEx02SuRBC5GGpVx+UZC6EEHlIzVwIIayAheZySeZCCJGXnDQkhBBWQEbmQghhBWQ2ixBCWIGi3tuzpJBkLoQQeVhoLpdkLoQQeUmZRQghrICF5nJJ5kIIkZecNGSlTp+OZ+LEr8i4dRsbG1s+G/8+9epVN3dYxUpRFMLDFlC9hgd9+gag0+mZNGExBw+eBOCVVo34ZNg7Rt1B3BqsX/8T3y7ZYHh869YdkpKu83PMN1SqVM58gRWjVSt+Zs2q3ahU4O7hQvin3Zk6cSWXLl4zrHP5cgpeTWswa977Zoy06Cz1r1iS+QPcvZtFv3fHMXHSELy9m7Jr5z6GfTKTrdELzB1asTl37jKTJizm6JGzVK/hAcCmjbuJj08kasN09Ho977w9lu3b9uPr18zM0RaPwMA2BAa2ASAnR8s774ym/4AuT0wiP3niApHf7uC7teGUKePIrOlrWTBvE9NmDTCsc+JYPMM/+poRo4PNGOnDsZGThqzPr78exsPjKby9mwLwatuXcHd3M3NUxWvlim0EBnlTuXJFQ5tOp+fu3Uyys3NQ9Ao5OVrs7TVmjNJ8/u/rdVSsUJbgYF9zh1Jsatf1JOqH8Wg0tmRl5XAt+SZPV/nn7yMnR8u40RF8POINnqpcwYyRPhxL/YJpsmQeHx+Po6Mjbm5ufP/995w+fZomTZrQoUMHU3X52MXHXaaSS3lGh83h1Kl4nJ1L8cmw3uYOq1iNHtMXgP37jhvaAoNas33bftq2fh+tVkeLlxvQuo2XmSI0nxup6SxZsoF1674wdyjFTqOx5addfzBh3DLs7NQMCgkwPLd+7a+4uJbl1dcamS/AR2CqXN6zZ0+uX7+OWp2bdsePH8/FixdZsGABOTk59O7dm+7duz/09k2SzL/99lsiIyPR6/U0a9aMxMRE2rVrx9q1a4mLi2Pw4MGm6Pax02p17I45SMTSSTRsWItdO/cxcMBn/PjTN9jZPZkjUYAF89dQvnwZYn5ZRGZWNqEhM/h2yWZ69+lo7tCK1arV23i17Yu4ezxZ39buadO2EW3aNmLdmj2EDJzD+i3jsbGxYUXkj4we9/BJydxMcQlcRVE4f/48P//8syGZJyUlMXToUNatW4ednR3BwcG89NJLVK/+cMfkTHLp3rVr17JlyxaWLVtGdHQ0ixYtonv37ixYsIBt27aZokuTcHGtwHPPudOwYS0A2r7WDJ1Oz6VLV80cmXnt3HGAzl3aoLFTU6aME50CW3Fg/wlzh1Xstm75lc6d25o7jGJ36WIyh3//y/C4U1ALEq+kkp5+h1MnL6HT6fB6oYYZI3w0KpXxS3p6OgkJCQWW9PT0fNs8f/48KpWK/v378/rrr7Ns2TJiY2Np1qwZ5cqVw8nJCV9fX6Kjox86bpMkc71ej52dHVWqVKFv377Y29sbntPpdKbo0iRatfLi8uVkjh/P/cP97bfjqFSqJ65u/m+161QleuteILc++tOPh2jY0HLfvA8jLS2DixcTadz4eXOHUuxSrqURNuwbbtzIAGDr5gNUq/405cqV5veDZ2j6Yi2LntmkwsboJSIigrZt2xZYIiIi8m0zPT2d5s2bM3/+fL799ltWrlzJlStXcHFxMazj6upKUlLSQ8dtkjKLj48P77zzDkuXLmXIkCEAnDp1ivDwcNq3b2+KLk3CxaU88+aHMf6zhdy9m4nGTsPcuaOwt7czd2hmNWJkTyZPWkJAh4+wsbHhpeb16NvvdXOHVawuXkjExaU8Gs2TN4egsVcN+vb3Y2CfL7C1tcXFtSwz5wwC4OKF5HwHQy2RSmX8GLdXr14EBQUVaHd2ds73uHHjxjRu3BgAJycnunbtypQpUxg0aNC/+n74D0GVoigmmYfz22+/8cILLxgenz9/nkuXLuHt7V3kbSmcfpyhWSyt/o65Qygx1DYO5g6hxLidk2juEEqU0ppXH+n1N7O3Gr1uOTvjBqcHDx4kJyeH5s2bA7BkyRIiIyNp3rw5kyZNAmD+/PkoikJISEjRg8aEt7vLm8gBnnvuuYdK5EIIUZxURfhnrFu3bjFt2jSysrLIyMggKiqK6dOns3fvXlJTU7l79y7bt2+nVatWDx33k/cdUQghHujx1/vbtGnDkSNHCAwMRK/X8/bbb+Pl5cXQoUPp2bMnOTk5dO3alQYNGjx0HyYrszxOUmbJJWWWf0iZ5R9SZsnvUcss6Tk7jF7XWdPukfp6nGRkLoQQeahMV302KUnmQgiRR1Fq4SWJJHMhhMhHRuZCCGHxLPWEJ0nmQgiRjyRzIYSweFIzF0IIK6DC1twhPBRJ5kIIkYfUzIUQwipIMhdCCIsnJw0JIYRVkJG5EEJYvKJcz7wkkWQuhBB5SJlFCCGsgpRZhBDC4slJQ0IIYQVknrkQQlgFqZkLIYTFkwOgQghhBaTMIoQQVsEyR+YWcUNnIYQQD2aZH0FCCCHykWQuhBBWQJK5EEJYAUnmQghhBSSZCyGEFZBkLoQQVkCSuRBCWAFJ5kIIYQUkmQshhBWQZG6ETZs20aFDB9q1a8fy5cvNHY5ZZWRk0LFjRxISEswdilnNmzcPf39//P39mTZtmrnDMavZs2fToUMH/P39WbJkibnDeWJJMi9EUlISs2bNYsWKFWzYsIFVq1bx119/mTssszhy5AjdunUjPj7e3KGYVWxsLHv27CEqKor169dz4sQJduzYYe6wzOLAgQPs27ePjRs3snbtWiIjIzl//ry5w3oiSTIvRGxsLM2aNaNcuXI4OTnh6+tLdHS0ucMyi9WrVzNu3DhcXV3NHYpZubi4MHLkSOzs7NBoNFSrVo0rV66YOyyzePHFF1m6dClqtZrr16+j0+lwcnIyd1hPJLlqYiGSk5NxcXExPHZ1deXo0aNmjMh8Jk2aZO4QSoQaNWoYfo6Pj2fLli2sXLnSjBGZl0ajYc6cOSxevBg/Pz/c3NzMHdITSUbmhbjfRSUt9XrH4vE6e/Ysffv2ZcSIETz77LPmDsesQkND2bt3L4mJiaxevdrc4TyRJJkXws3NjZSUFMPj5OTkJ77MIODQoUP07t2bjz/+mKCgIHOHYzbnzp3j5MmTADg6OuLj48Pp06fNHNWTSZJ5IVq0aMHevXtJTU3l7t27bN++nVatWpk7LGFGiYmJDB48mBkzZuDv72/ucMwqISGB8PBwsrOzyc7OZteuXXh5eZk7rCeS1MwL4ebmxtChQ+nZsyc5OTl07dqVBg0amDssYUbffPMNWVlZTJ061dAWHBxMt27dzBiVeXh7e3PkyBECAwOxtbXFx8fnif+AMxe505AQQlgBKbMIIYQVkGQuhBBWQJK5EEJYAUnmQghhBSSZCyGEFZCpiaLEmDhxIr/99huQezJKlSpVcHBwAGDVqlWGn4UQBcnURFEivfrqq8yePZv69eubOxQhLIKMzEWJN3fuXP744w+Sk5OpVasWnp6e3Lhxg7Fjxxqev/f41q1bTJo0iTNnzpCTk0Pz5s0ZPnw4arX8qQvrJjVzYREuX75MVFQUM2bMeOB6kydPpm7duqxbt47169dz48YNuWGCeCLIcEVYhEaNGhk1uv755585duwYa9asASAzM9PUoQlRIkgyFxYh7w0PVCpVvksT5+TkGH7W6/XMnj2batWqAZCeni6XLBZPBCmzCItTvnx5Tpw4gaIo3Llzhz179hiea9myJd9++y2KopCdnc17773HsmXLzBitEMVDkrmwOK+//joVKlTAx8eHAQMG0LhxY8Nzo0eP5s6dOwQEBBAQEEDNmjXp16+fGaMVonjI1EQhhLACMjIXQggrIMlcCCGsgCRzIYSwApLMhRDCCkgyF0IIKyDJXAghrIAkcyGEsAKSzIUQwgr8P6yAXjVXSn8mAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.897912  0.883562  0.890679\n",
      "1   0.635036  0.467742  0.538700\n",
      "2   0.622018  0.782910  0.693252\n",
      "3   0.544118  0.493333  0.517483\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from utils.error_analysis import *\n",
    "\n",
    "test_iter = Data.DataLoader(\n",
    "    test_data, batch_size=batch_size, shuffle=True, collate_fn=PadCollate(dim=0))\n",
    "\n",
    "with torch.no_grad():\n",
    "    model.eval()\n",
    "    pred = []\n",
    "    gt = []\n",
    "    for data, label in test_iter:\n",
    "        data = data.to(device)\n",
    "        label = label.long().to(device)\n",
    "        gt.extend(label.cpu().numpy().tolist())\n",
    "        logit = model(data)\n",
    "        pred.extend(logit.argmax(dim=1).cpu().numpy().tolist())\n",
    "pred = np.array(pred)\n",
    "gt = np.array(gt)\n",
    "error_analysis(pred, gt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TF-IDF SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T03:29:06.429288Z",
     "start_time": "2020-12-22T03:28:44.270996Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from gensim.models import KeyedVectors\n",
    "from utils.doc_tool import *\n",
    "from utils.error_analysis import *\n",
    "\n",
    "w2v = KeyedVectors.load_word2vec_format('w2v/Lyric_ChineseEmbedding.txt',binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T03:31:15.707962Z",
     "start_time": "2020-12-22T03:29:22.066599Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache /tmp/jieba.cache\n",
      "Loading model cost 0.914 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "processing...\n",
      "tfidf averaging...\n"
     ]
    }
   ],
   "source": [
    "# load our idf\n",
    "with open('./Dataset/data/train_idf.txt', 'r') as f:\n",
    "    train_idf = eval(f.read())\n",
    "\n",
    "# split training strings and val strings\n",
    "train_str = []\n",
    "val_str = []\n",
    "test_str = []\n",
    "train = np.load('Dataset/data/train.npy')\n",
    "val = np.load('Dataset/data/val.npy')\n",
    "test = np.load('Dataset/data/test.npy')\n",
    "for i in range(len(train)):\n",
    "    lyric = train[i, 0]\n",
    "    split = []\n",
    "    for word in jieba.cut(lyric):\n",
    "        if word in w2v.vocab:\n",
    "            split.append(word)\n",
    "        else:\n",
    "            for w in word:\n",
    "                split.append(w)\n",
    "    train_str.append(split)\n",
    "    \n",
    "for i in range(len(val)):\n",
    "    lyric = val[i, 0]\n",
    "    split = []\n",
    "    for word in jieba.cut(lyric):\n",
    "        if word in w2v.vocab:\n",
    "            split.append(word)\n",
    "        else:\n",
    "            for w in word:\n",
    "                split.append(w)\n",
    "    val_str.append(split)\n",
    "    \n",
    "for i in range(len(test)):\n",
    "    lyric = test[i, 0]\n",
    "    split = []\n",
    "    for word in jieba.cut(lyric):\n",
    "        if word in w2v.vocab:\n",
    "            split.append(word)\n",
    "        else:\n",
    "            for w in word:\n",
    "                split.append(w)\n",
    "    test_str.append(split)\n",
    "\n",
    "# load in our training data and val data\n",
    "print('processing...')\n",
    "train_data = dataset2mat(np.load('Dataset/data/train.npy'), w2v)\n",
    "val_data = dataset2mat(np.load('Dataset/data/val.npy'), w2v)\n",
    "test_data = dataset2mat(np.load('Dataset/data/test.npy'), w2v)\n",
    "\n",
    "# compute the average and trainsform it into numpy\n",
    "print('tfidf averaging...')\n",
    "avg_train = []\n",
    "train_label = []\n",
    "avg_val = []\n",
    "val_label = []\n",
    "avg_test = []\n",
    "test_label = []\n",
    "\n",
    "def tfidf_average(lyric_split, lyric_split_vector, idf):\n",
    "    average_vector = np.zeros(lyric_split_vector[0].shape)\n",
    "    freq = Counter(lyric_split)\n",
    "    num = len(lyric_split)\n",
    "    for idx, word in enumerate(lyric_split):\n",
    "        average_vector += freq[word] * lyric_split_vector[idx] \n",
    "    return average_vector / num\n",
    "    \n",
    "for i in range(len(train_data)):\n",
    "    avg_train.append(tfidf_average(train_str[i], train_data[i][0], train_idf)) \n",
    "    train_label.append(int(train_data[i][1]))\n",
    "    \n",
    "for i in range(len(val_data)):\n",
    "    avg_val.append(tfidf_average(val_str[i], val_data[i][0], train_idf))\n",
    "    val_label.append(int(val_data[i][1]))\n",
    "    \n",
    "for i in range(len(test_data)):\n",
    "    avg_test.append(tfidf_average(test_str[i], test_data[i][0], train_idf))\n",
    "    test_label.append(int(test_data[i][1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T03:31:40.139687Z",
     "start_time": "2020-12-22T03:31:17.771616Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVC(C=5.0, gamma=0.1)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "model = SVC(kernel='rbf',decision_function_shape ='ovr',gamma=0.1, C=5.0, coef0=0.0, degree=3)\n",
    "model.fit(avg_train, train_label)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T03:36:17.301056Z",
     "start_time": "2020-12-22T03:36:14.578398Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7029411764705882\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.860169  0.898230  0.878788\n",
      "1   0.549254  0.533333  0.541176\n",
      "2   0.659836  0.700000  0.679325\n",
      "3   0.676923  0.427184  0.523810\n"
     ]
    }
   ],
   "source": [
    "pred_y = model.predict(avg_val)\n",
    "pred_y = np.array(pred_y)\n",
    "true_y = np.array(val_label)\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-12-22T03:36:25.067429Z",
     "start_time": "2020-12-22T03:36:22.235889Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total_accuracy:  0.7101669195751138\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wangzhengbo/anaconda3/envs/torch/lib/python3.8/site-packages/sklearn/utils/validation.py:67: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 0.25 passing these as positional arguments will result in an error\n",
      "  warnings.warn(\"Pass {} as keyword args. From version 0.25 \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   precision    recall  f1_score\n",
      "0   0.880090  0.888128  0.884091\n",
      "1   0.587766  0.594086  0.590909\n",
      "2   0.645598  0.660508  0.652968\n",
      "3   0.701754  0.533333  0.606061\n"
     ]
    }
   ],
   "source": [
    "pred_y = model.predict(avg_test)\n",
    "pred_y = np.array(pred_y)\n",
    "true_y = np.array(test_label)\n",
    "error_analysis(pred_y, true_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "torch",
   "language": "python",
   "name": "torch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "307.2px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
